Метод weakreference get(), насколько он безопасен? (Android, asynctask)
Я делаю мобильное приложение для Android. У меня есть WeakReference для моей активности в AsyncTask, чтобы убедиться, что это может быть сбор мусора.
Когда вызов onPostExecute()
вызывается, я делаю
Acitivty activity = mWeakRef.get();
Затем я использую объект активности для отображения диалогов пользователю и т.д. и т.д.
Мой вопрос в том, как я пытаюсь определить, какой диалог показывать и что делать, может ли мой объект активности стать нулевым? Может ли оно когда-нибудь стать нулевым, если GC работает между моей линией исполнения? Я уверен, что продолжать использовать этот объект из первого get()
или мне нужно переделать get()
и проверить, имеет ли значение значение null до его использования.
спасибо!
Ответы
Ответ 1
Это безопасно!
Как только вы назначаете результат get() переменной, у вас снова есть сильная ссылка, которая блокирует сбор gargbage для этого объекта, пока существует новая ссылка.
Конечно, после этого задания вам нужно проверить, является ли действие нулевым.
Ответ 2
Я думаю, что это НЕ безопасно. Я получаю NPE в activity.msgWebView.setVisibility(View.GONE);
внутри обработчика.
`` `ява
закрытый статический класс HttpStatusHandler расширяет Handler {
private WeakReference<MessageWebViewActivity> activityWeakReference;
public HttpStatusHandler(WeakReference<MessageWebViewActivity> activityWeakReference) {
this.activityWeakReference = activityWeakReference;
}
@Override
public void handleMessage(Message msg) {
MessageWebViewActivity activity = activityWeakReference.get();
if (activity != null) {
if (msg.what == MSG_URL_OK) {
activity.loadUrl(activity.url);
} else if (msg.what == MSG_URL_ERROR) {
activity.msgWebView.setVisibility(View.GONE);
activity.clPageError.setVisibility(View.VISIBLE);
activity.progressbarLayout.setVisibility(View.GONE);
}
}
}
}
`` `