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 に答える