1

如果我有一个调用执行异步任务的方法的类的本地实例,我是否可以依赖在异步任务完成之前永远不会执行垃圾收集。这是我所指的一个例子;如果我有以下情况:

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

4

2 回答 2

3

GetHtmlTask有对它的引用时,它不会被垃圾收集。只要线程处于活动状态,调度程序就会维护这样的引用。因为它又是您的类的内部类HtmlReader,所以它维护对其封闭实例的引用。因此,只要任务正在运行,实例就不会被垃圾回收。

于 2013-03-24T20:43:33.457 回答
1

我对垃圾收集的了解是,垃圾收集仅在对象超出范围并且对象没有指向它们的实时引用时才会发生。在您的情况下,我认为阅读器对象不会被垃圾收集,因为异步任务是由阅读器实例产生的仍然处于活动状态。一旦读取器对象产生的每个对象都超出范围,那么它将被垃圾收集。

更多关于Java 中的垃圾收集

于 2013-03-24T20:43:25.497 回答