Передача ссылки на активность в класс Android
Я понимаю, что этот вопрос задавался много раз, но я все еще не могу полностью понять эту концепцию. В моем приложении я использую статический служебный класс для хранения общих методов (например, отображение диалогов об ошибках)
Вот как выглядит мой статический класс:
public class GlobalMethods {
//To show error messages
public static final void showSimpleAlertDialog(final Activity activity, String message, final boolean shouldFinishActivity) {
if (!activity.isFinishing()) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity, AlertDialog.THEME_HOLO_DARK);
builder.setCancelable(true).setMessage("\n" + message + "\n").setNeutralButton(activity.getResources().getString(R.string.label_ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.cancel();
}
}).setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
// TODO Auto-generated method stub
if (shouldFinishActivity)
activity.finish();
}
}).show();
}
}
//check for connectivity
public static final boolean isOnline(Context context) {
NetworkInfo networkInfo = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
return (networkInfo != null && networkInfo.isConnectedOrConnecting());
}
//for the 'HOME' button on every activity
public static final void goToDashboard(Activity activity) {
goToActivity(ActivityDashboard.class, activity);
}
}
В своей основной деятельности я называю эту функцию так
GlobalMethods.showSimpleAlertDialog(this, R.string.error_msg_failed_load, true);
Это хороший подход? Это вызывает утечки памяти? Если да, пожалуйста, ознакомьте меня с лучшими практиками использования служебных классов.
1 ответ
Решение
Нет, это плохой подход. Тебе лучше пройти WeakReference<Activity>
к вашим методам и реализуйте такие методы:
public static final void showSimpleAlertDialog(final WeakReference<Activity> mReference, String message, final boolean shouldFinishActivity) {
Activity activity = mReference.get();
if (activity != null) {
//your code goes here
}
Дополнительное чтение: http://android-developers.blogspot.ae/2009/01/avoiding-memory-leaks.html