2013-03-24 2 views
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?

+0

Содержит ли reader.addHtmlListener ссылку на слушателя в коллекции, поддерживаемой читателем? –

+0

Я уверен, что из-за того, что читателя можно получить из активного потока для AsyncTask, он не будет иметь права на сбор мусора. Если вы беспокоитесь (или вы столкнулись с некоторой проблемой, которая заставляет вас поверить иначе), вы можете просто добавить явные ссылки на читателя в AsyncTask (GetHthmlTask). – FrankieTheKneeMan

+0

@PatriciaShanahan Я завершил код для HtmlReader – BruceHill

ответ

3

GetHtmlTask не будет собирать мусор, пока есть ссылка на него. Планировщик поддерживает такую ​​ссылку, пока поток жив. Поскольку он, в свою очередь, является внутренним классом вашего класса HtmlReader, он поддерживает ссылку на его экземпляр-экземпляр. Следовательно, экземпляр не будет собираться мусором, пока задача выполняется.

+0

Очень четкий и краткий ответ. Благодарю. – BruceHill

1

Что я знаю о сборке мусора, так это то, что сбор мусора происходит только тогда, когда объекты исчезают из области действия, а объекты не имеют прямых ссылок, указывающих на них. В вашем случае, я думаю, что объект-читатель не будет собирать мусор, так как асинхронная задача, порожденная экземпляром считывателя, по-прежнему активна. Как только каждый объект, порожденный объектом-читателем, выходит за рамки только тогда, он будет собирать мусор.

Подробнее о Garbage Collection в java.

Смежные вопросы