Контексты, AsyncTask и изменения вращения - PullRequest
3 голосов
/ 12 февраля 2012

Рекомендуется ли использовать getApplicationContext() при работе с AsyncTask, чтобы не приходилось присоединять и отсоединять действие , чтобы избежать утечек памяти , когда происходят изменения поворота и Деятельность уничтожена ?Я думаю, что это должно быть правильно, так как мне действительно нужен контекст, который зависит от дырочного приложения, а не от самого действия.

И более того, в тех случаях, в которых лучше использовать действиев качестве контекста (потому что вам нужен доступ к показу Activity) ... Вместо того, чтобы отсоединять его (присваивать null), когда он уничтожен, а затем назначать новый экземпляр в onCreate(), можно просто избежать отсоединения? Таким образом, просто переназначая новый экземпляр, таким образом, мы могли бы избежать проблем с NullPointerException, потому что всегда будет контекст для использования!

Ответы [ 2 ]

1 голос
/ 06 марта 2012

Этот пост и его ответы являются хорошим объяснением того, что делать. Этот пост и его ответы объясняют некоторые хорошие теории, стоящие за проблемами AsyncTask и Context.

0 голосов
/ 15 марта 2012

Из своего собственного опыта могу сказать, что в большинстве случаев лучше использовать Activity в качестве Context, чем getApplicationContext() при работе с AsyncTask.Это связано с тем, что в большинстве случаев вам потребуется доступ к участникам из вашей активности, и вам будет разрешено делать это только в том случае, если в вашей AsyncTask есть ссылка на действие.

Чтобы ответить на мой вопрос о том, как избежать detach() позвольте мне сказать, что в этом случае вы можете избежать этого или просто сделать это без каких-либо проблем, как @CommonsWare заявляет в своем ответе .Итак, исходя из того, что он говорит, мы уверены, что мы не получим NullPointerException, пока активность будет нулевой во время изменения поворота:

onProgressUpdate () и onPostExecute () приостановлены между началомonRetainNonConfigurationInstance () и конец последующего onCreate ()

Если я не ошибаюсь, главное отличие не в явном отсоединении и просто повторном присоединении нового в onCreate() новогосозданная активность - это то, что вы освобождаете старый экземпляр активности через несколько миллисекунд, когда просто присоединяете.Но окончательное поведение одинаково в обоих случаях!

Надеюсь, это поможет кому-то еще!:)

...