WeakReference.get () возвращает ноль после проверки на это - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть асинхронная задача, выполняемая из представления, и в onPostExecute я извлекаю экземпляр представления, используя weakReference.get(), и проверяю, отличается ли этот экземпляр от null.Позже в onPostExecute я вызываю метод из weakReference.get() и получаю NullPointerException.

  1. Это можно решить, позвонив по ссылке, которую я получил?

  2. Есть ли какой-либо способ, которым значение weakReference.get() будет отличаться от эталона, который я получил в начале?

Например, так ли этоВозможно, что вызов method() представления приведет к NullPointerException?

Образец:

private WeakReference<View> weakReference;

[...]

@Override
protected void onPostExecute(Boolean result) {    
    View v = weakReference.get();
    if (v == null) {
        return;
    }
    […]
    getView().method();
}

Спасибо большоемного.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Q1: Будет ли это решено путем вызова из ссылки, которую я получил?

Да, это будет решено путем вызова из ссылки.Таким образом, если ссылка имеет значение null, обрабатывайте ее или используйте ее как method() вызывающий.


Q2: Есть ли способ, которым weakReference.get()значение будет отличаться от ссылки, которую я получил в начале?

Да, если произойдут какие-либо изменения конфигурации (действие / фрагмент воссоздается сам) , означает, что представление воссоздано, и вашссылка на старый вид будет null.


Вывод: Хорошей практикой будет иметь ссылку на ваш вид и выполнять любые операции из этогоссылка далее

0 голосов
/ 25 сентября 2018

Я не думаю, что сохранение ссылок View во время AsyncTask - это хороший подход.Вы должны изменить свою архитектуру асинхронной работы по-другому.Пожалуйста, ознакомьтесь с Android Jetpack , там вы найдете практические рекомендации практически для каждого случая разработки Android.И любые проблемы, связанные с состоянием «активность уничтожена», будут обрабатываться автоматически, если вы будете использовать Компоненты архитектуры Android .

Что касается вашего случая, WeakReference можно очистить в любое время, когда решит сборщик мусора.Таким образом, это нормальная ситуация, когда вы можете увидеть «ноль» в любой момент.

«Есть ли какой-нибудь способ, которым значение weakReference.get () будет отличаться от ссылки, которую я получил в начале?»- Да, например, пользователь будет поворачивать экран, или система Android может уничтожить и воссоздать вашу активность, когда объем памяти невелик.После этого Activity со всеми представлениями будет воссоздан, и это означает, что система создаст новые экземпляры всех представлений.

"Возможно ли, что вызов метода () для представления приведет к исключению nullPointerException?"- Да, это на самом деле может случаться очень часто.Например, вы запустили AsyncTask и после этого до завершения AsyncTask - поверните экран.

...