如果我有一个调用执行异步任务的方法的本地实例实例,我是否可以依赖于异步任务完成之前永远不会执行的垃圾收集。这是我所指的一个例子;如果我有以下内容:
private void loadDocument(String url) {
HtmlReader reader = new HtmlReader();
reader.addHtmlListener(this);
reader.loadUrl(url);
}
并且HtmlReader
的代码如下所示:
public class HtmlReader {
ArrayList<HtmlListener> _htmlListeners = new ArrayList<HtmlListener>();
public void addHtmlListener(HtmlListener listener) {
this._htmlListeners.add(listener);
}
public void removeHtmlListener(HtmlListener listener) {
this._htmlListeners.remove(listener);
}
public void processHtmlResponse(String url, String html) {
for (HtmlListener listener: this._htmlListeners) {
listener.loadUrlSuccessCallback(url, html);
}
}
public void loadUrl(String url) {
new GetHtmlTask().execute(url);
}
class GetHtmlTask extends AsyncTask<String, Void, String> {
protected String doInBackground(String... urls) {
....
}
protected void onPostExecute(String html) {
processHtmlResponse(html);
}
}
public interface HtmlListener {
void loadUrlSuccessCallback(String url, String html);
}
}
鉴于这种情况,loadDocument
方法肯定会在异步任务完成之前完成。我可以确定reader
实例在GetHtmlTask
完成之后才会被垃圾收集吗?
答案 0 :(得分:3)
GetHtmlTask
在引用时不会被垃圾收集。只要线程处于活动状态,调度程序就会维护这样的引用。因为它反过来是HtmlReader
类的内部类,它维护对其封闭实例的引用。因此,只要任务正在运行,实例就不会被垃圾收集。
答案 1 :(得分:1)
我对垃圾收集的了解是,只有当对象超出范围且对象没有指向它们的实时引用时才会发生垃圾收集。在你的情况下,我认为读者对象不会被垃圾收集,因为读者实例产生的异步任务仍然是活动的。一旦读取器对象生成的每个对象都超出范围,那么它将被垃圾收集。
更多关于java中的Garbage Collection。