在AsyncTask中持有Activity的WeakReference,Application对象会存活还是被回收?
AsyncTask持有Activity弱引用时,对象会被回收吗?
嘿,这两个问题本质是同一个事儿,我直接给你说清楚:持有Activity的WeakReference并不会强制让Activity(也就是你说的“应用对象”)保持存活,它依然可能被垃圾回收器收走,核心看有没有强引用还勾着它。
先给你掰明白WeakReference的逻辑:弱引用的对象,只要GC运行时发现没有任何强引用指向它,不管内存够不够,都会被回收——弱引用本身完全挡不住GC的脚步。
回到AsyncTask的场景:
- 如果你在AsyncTask里只存了Activity的WeakReference,当用户退出Activity(比如按返回键),此时Activity的所有强引用都被清掉了(比如Activity栈里的实例被移除,其他地方也没再持有它的强引用),那哪怕AsyncTask还在后台吭哧吭哧跑
doInBackground,GC只要一运行,这个Activity就会被回收。 - 举个实际例子:你在Activity里启动AsyncTask,用
WeakReference<MyActivity> holdActivity = new WeakReference<>(this);当Activity被销毁后,你在AsyncTask的onPostExecute里调用holdActivity.get(),很大概率会拿到null,这就说明Activity已经被GC收走了。
这里要纠正一个常见误区:有人觉得AsyncTask是后台任务,会让关联的对象存活,但其实决定对象生死的是强引用链,和AsyncTask是否在运行无关——只要没有强引用牵着Activity,弱引用根本留不住它。
哦对了,要是你的AsyncTask本身被某个强引用攥着(比如Application的全局变量里存了这个AsyncTask实例),那AsyncTask自己会存活,但这和Activity的弱引用没关系,Activity该回收还是会回收,只是AsyncTask本身没被GC清掉而已。
内容的提问来源于stack exchange,提问作者grad9
相关产品推荐
相关产品推荐

