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

时间:2015-03-29 16:02:51

标签: android multithreading android-asynctask garbage-collection

我使用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 个答案:

答案 0 :(得分:3)

  

我的一个猜测是它创建了一个线程,并且该线程具有对该对象的引用。一旦线程死亡,AsyncTask也会被垃圾收集。

这是正确的。线程is considered a GC root。该线程引用了AsyncTask,阻止了它的收集。

尽管如此,如果它应该被收集,你甚至可以在调用onPostExecute之前依赖垃圾收集器。

答案 1 :(得分:1)

AsyncTask只是java工作线程的包装器。因此,当您的主进程处于活动状态时,您的工作线程将运行而不是GC。完成后,AsyncTask在主线程上执行onPostExecute(),这意味着工作线程已经死亡,AsyncTask可以作为普通对象收集。