Вызов clear () на WeakReference не работает - PullRequest
0 голосов
/ 13 января 2019

Я использую вложенный частный статический класс AsyncTask в своей Деятельности, чтобы выполнить некоторую работу, и я передаю контекст Activity в AsyncTask и инициализирую его как WeakReference.
После того, как моя работа закончена, в onPostExecute() я звоню
if(mContext.get() != null) mContext.clear();

но когда я проверяю в logcat, mContext != null, всегда ли возвращается true.

1 Ответ

0 голосов
/ 13 января 2019

Я просмотрел некоторые статьи и некоторые другие ответы на вопросы stackoverflow, и я пришел к выводу, что вы не получите mContext == null до тех пор, пока вы не назначите ноль, или действие не завершится или не будет уничтожено до того, как асинхронная задача сможет завершить работу. .

Итак, когда вы используете mContext.clear();, вы не делаете mContext нулевым, вы просто очищаете этот ссылочный объект, и его вызов не приведет к постановке объекта в очередь для GC. Так что вы получите только mContext.get() == null true после того, как вы очистите ссылки следующим образом.

@Override
        protected void onPostExecute(Object object) {
            super.onPostExecute(object);
            if (mContext.get() != null) {
                mContext.clear();
            }

            Log.d("MG-Context", mContext.get() == null ? "Yes" : "No");
        } 

Пожалуйста, загляните в эту статью здесь для большей информации: https://medium.com/google-developer-experts/finally-understanding-how-references-work-in-android-and-java-26a0d9c92f83

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...