Если я сохраню WeakReference активности в AsyncTask, останется ли мой объект приложения живым или он будет собираться сборщиком мусора?
По этому поводу нет однозначного ответа. Скажем, у меня есть приложение A, Activity B, Async C. Если Async C имеет WeakReference B, сохраняет ли это объект Application в A или его можно собрать мусором?
вы знаете, что такое WeakReference?
@TimCastelijns + дополнительная информация, контекст / время работы, вопрос в том, когда действие было закрыто / или закрыто, однако асинхронный режим все еще работает, кроме того, это только одно приложение действия.
Я предполагаю, что когда вы говорите «мой объект приложения», вы имеете в виду экземпляр android.app.Application (который может быть или не быть подклассом в зависимости от вашего конкретного AndroidManifest.xml).
Экземпляр Application для Android-приложения никогда не будет собираться сборщиком мусора. Пока ваше приложение работает, есть единственный экземпляр класса Application. Корневая ссылка происходит от ActivityThread, который является основным потоком вашего приложения. ActivityThread входит в Looper.loop() и никогда не возвращается.
Когда система Android решит, что ваше приложение становится "старый" кешированный процесс и больше не нужно, оно будет прекращено. В этом случае он не беспокоит возвращение ActivityThread, поэтому экземпляр Application не будет собираться мусором, он просто будет удален при остановке вашего процесса.
Новый экземпляр Application будет создан при следующем запуске вашего приложения Android.
Таким образом, хранение WeakReference в Activity не влияет на экземпляр Application, пока ваш процесс работает, экземпляр Application доступен. Вы можете безопасно хранить ссылку на экземпляр Application где угодно и обращаться к нему в любое время, см. Пример Получить экземпляр приложения из статического метода. Вы также можете вызвать в Context#getApplicationContext() и при необходимости сохранить его на потом.
вы можете проверить это stackoverflow.com/questions/44309241/…. это может помочь