Должны ли я обнулять ссылки на контекст деятельности, когда моя активность заканчивается? - PullRequest
3 голосов
/ 16 февраля 2011

Это хорошая практика, чтобы обнулить ссылки на контекст деятельности, когда моя активность заканчивается? У меня есть 3 AsyncTask, каждый из которых может быть запущен в нескольких экземплярах одновременно. Обновите пользовательский интерфейс в onPostExecute (). Обнулить все ссылки на контекст деятельности в onDestroy () было бы довольно сложно и сделать код беспорядочным. Что лучше всего сделать?

Ответы [ 4 ]

2 голосов
/ 16 февраля 2011

Проверьте WeakAsyncTask для примера от Google асинхронной задачи, которая не поддерживает ссылки после жизненного цикла активности, и BetterAsyncTask от DroidFu для примера способа связать AsyncTasksчтобы они могли повторно подключиться к новым экземплярам активности (например, после ротации);Пример использования: здесь .

Вероятно, не слишком много вреда для сохранения ссылок на Activity вокруг короткой операции (например, одного небольшого веб-запроса или записи в небольшой файл), но если естьвозможность для задач накапливаться, это может вызвать проблемы.Например, если ваше приложение считывает XML-файл размером 200 КБ с сервера при создании, что, скажем, может занять 1 минуту или более по сравнению с EDGE, быстрое переключение телефона с открытым / закрытым 3 или 4 раза может привести к 4 сохраненным экземплярам Activity -- в этой ситуации вы можете довольно быстро исчерпать память, не говоря уже о дублированной работе.

Для любых действительно длительных процессов, тем не менее, вы должны обязательно рассмотреть IntentService вместоAsyncTask.Они предназначены для более длительных процессов, которые на самом деле не привязаны к определенному мероприятию, например, как вы можете отправить MMS и оставить занятие, чтобы заняться другими делами, и вы получите приятный счастливый тост, информирующий вас о завершениизадание, когда оно завершается.

1 голос
/ 16 февраля 2011

Если задания будут иметь право на сборку мусора вскоре после завершения вашей деятельности, я не вижу проблем с сохранением ссылок.

Если задачи действительно переживают действие в течение значительного периода времени, вы должны установить все ссылки на Контекст действия на null. См. Также статью Предотвращение утечек памяти .

В любом случае рекомендуется использовать контекст приложения (getApplicationContext()) вместо контекста действия всякий раз, когда это возможно. В этом случае вы не можете сделать это, потому что вам нужно публиковать сообщения пользовательского интерфейса; Я просто упоминаю это для полноты.

1 голос
/ 16 февраля 2011

Не сохраняйте долгоживущие ссылки на контекстную активность (ссылка на операцию должна иметь тот же жизненный цикл, что и сама деятельность).Попробуйте использовать контекстное приложение вместо контекстного действия.Обнуление ссылок не требуется, если вам не нужно обратное из-за проблем с памятью.

0 голосов
/ 16 февраля 2011

Вы можете хранить контекстную ссылку, используя Слабую ссылку. http://developer.android.com/reference/java/lang/ref/WeakReference.html

Слабые ссылочные объекты могут быть GC'd. Вы должны просто проверить, действительна ли ваша контекстная ссылка каждый раз, когда вы ее используете.

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