我使用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也会被垃圾收集。
我的猜测是否接近实际答案?
答案 0 :(得分:3)
我的一个猜测是它创建了一个线程,并且该线程具有对该对象的引用。一旦线程死亡,AsyncTask也会被垃圾收集。
这是正确的。线程is considered a GC root。该线程引用了AsyncTask
,阻止了它的收集。
尽管如此,如果它应该被收集,你甚至可以在调用onPostExecute
之前依赖垃圾收集器。
答案 1 :(得分:1)
AsyncTask只是java工作线程的包装器。因此,当您的主进程处于活动状态时,您的工作线程将运行而不是GC。完成后,AsyncTask在主线程上执行onPostExecute()
,这意味着工作线程已经死亡,AsyncTask可以作为普通对象收集。