Android Asyntask: используйте слабую ссылку для контекста, чтобы избежать поворота экрана устройства

В Apress Pro Android 4 автор сказал, что:

[...] контекст текущей активности перестанет быть действительным при повороте устройства. [...] Один из подходов заключается в использовании слабой ссылки на активность вместо жесткой ссылки [...]

Но автор лишь предлагает это, а не рассказывает, как это делается. Кто делал это раньше, приведите пример.


person hqt    schedule 21.03.2012    source источник


Ответы (3)


Где-то в вашем AsyncTask вы захотите передать свою активность. Затем вы сохраните эту ссылку в слабой ссылке. Затем вы можете разыменовать и снова использовать его в onPostExecute.

Член класса:

WeakReference<Activity> weakActivity;

Где-то в AsyncTask, вероятно, либо в конструкторе, либо в onPreExecute:

weakActivity = new WeakReference<Activity>(activity);

In onPostExecute:

Activity activity = weakActivity.get();
if (activity != null) {
   // do your stuff with activity here
}
person kabuko    schedule 21.03.2012
comment
activity по-прежнему будет недействительной ссылкой, если GC не сработает вовремя. Пожалуйста, поправьте меня, если я ошибаюсь. - person q126y; 30.06.2016
comment
это позволяет избежать утечки памяти? - person Mahdi-Malv; 17.03.2018
comment
‹Активность› в определении объекта не требуется, если установлен уровень языка Java 8. - person peterchaula; 23.07.2018
comment
WeakReference имеет свойство, называемое isEnqueued (я думаю), которое вы можете использовать, чтобы определить, помещен ли объект, на который делается ссылка, в очередь для сборки мусора. Если это так, вы можете предположить, что объект больше не действителен - person Leo; 17.08.2019

Вот пример WeakReference для хранения контекста;

WeakReference<Context> cReference = new WeakReference<Context>(getApplicationContext());

Теперь мы можем использовать эту слабую ссылку для выполнения работы, связанной с действием/контекстом.

person Akhil    schedule 21.03.2012
comment
Сохранение контекста приложения в WeakReference довольно бессмысленно. Контекст приложения существует до тех пор, пока существует приложение, и никогда не будет разыменован. - person JensV; 18.03.2019

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

Проверьте эту ссылку для более подробной информации

Сохранение состояния приложения

person prijupaul    schedule 21.03.2012