Метод 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);
            }

        }
    }
}

`` `