Если я сохраню WeakReference активности в AsyncTask, останется ли мой объект приложения живым?

Если я сохраню WeakReference активности в AsyncTask, останется ли мой объект приложения живым или он будет собираться сборщиком мусора?

вы можете проверить это stackoverflow.com/questions/44309241/…. это может помочь

Linh 04.04.2018 10:54

По этому поводу нет однозначного ответа. Скажем, у меня есть приложение A, Activity B, Async C. Если Async C имеет WeakReference B, сохраняет ли это объект Application в A или его можно собрать мусором?

grad9 04.04.2018 11:01

вы знаете, что такое WeakReference?

Tim 04.04.2018 13:57

@TimCastelijns + дополнительная информация, контекст / время работы, вопрос в том, когда действие было закрыто / или закрыто, однако асинхронный режим все еще работает, кроме того, это только одно приложение действия.

grad9 05.04.2018 03:38
0
4
265
1

Ответы 1

Я предполагаю, что когда вы говорите «мой объект приложения», вы имеете в виду экземпляр android.app.Application (который может быть или не быть подклассом в зависимости от вашего конкретного AndroidManifest.xml).

Экземпляр Application для Android-приложения никогда не будет собираться сборщиком мусора. Пока ваше приложение работает, есть единственный экземпляр класса Application. Корневая ссылка происходит от ActivityThread, который является основным потоком вашего приложения. ActivityThread входит в Looper.loop() и никогда не возвращается.

Когда система Android решит, что ваше приложение становится "старый" кешированный процесс и больше не нужно, оно будет прекращено. В этом случае он не беспокоит возвращение ActivityThread, поэтому экземпляр Application не будет собираться мусором, он просто будет удален при остановке вашего процесса.

Новый экземпляр Application будет создан при следующем запуске вашего приложения Android.

Таким образом, хранение WeakReference в Activity не влияет на экземпляр Application, пока ваш процесс работает, экземпляр Application доступен. Вы можете безопасно хранить ссылку на экземпляр Application где угодно и обращаться к нему в любое время, см. Пример Получить экземпляр приложения из статического метода. Вы также можете вызвать в Context#getApplicationContext() и при необходимости сохранить его на потом.

Другие вопросы по теме