为什么如果引用超出范围,AsyncTask不会被垃圾回收?

4

我正在使用AsyncTask在ListView中加载一些图片。代码大致如下:

private void loadImageInBackground(ViewHolder holder, Location location) {
    ImageViewLoader coverImageLoader = new ImageViewLoader(holder.locationImage, coversImgCache);
    coverImageLoader.execute(location.getImageUrl());
}

其中 ImageViewLoader 只是一个扩展的 AsyncTask。
据我的理解,垃圾回收器会收集所有不再被引用的内容。
当栈指针离开上面的函数时,该类失去了对创建的 ImageViewLoader 对象的任何引用。这应该被垃圾回收,不是吗?
然而,AsyncTask 仍在工作,并最终回调 onPostExecute。
我猜其中一种可能是它创建了一个线程,而该线程有一个对象的引用。一旦线程结束,AsyncTask 也会被垃圾回收。
我的猜测与实际答案有多接近?
2个回答

3
我的猜测之一是它创建了一个线程,该线程引用了对象。一旦线程死亡,AsyncTask 也会被垃圾回收。

那是正确的。线程被视为GC根。此线程引用了 AsyncTask,防止其被回收。

但是,如果应该被回收,您甚至不能指望垃圾收集器在调用 onPostExecute 之前启动。


1

AsyncTask只是Java工作线程的一个包装器。因此,在您的主进程存活时,您的工作线程将运行而不是GC。当它完成时,AsyncTask会在主线程上执行onPostExecute(),这意味着工作线程已经结束,AsyncTask可以像普通对象一样被回收。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接