Если у меня есть локальный экземпляр класса, который вызывает метод, выполняющий асинхронные задачи, могу ли я зависеть от сборки мусора, которая никогда не выполняется до завершения асинхронных задач. Вот пример того, что я имею в виду; если у меня есть следующие:Сбор мусора локального экземпляра, который вызывает метод, выполняющий асинхронные задачи
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
?
Содержит ли reader.addHtmlListener ссылку на слушателя в коллекции, поддерживаемой читателем? –
Я уверен, что из-за того, что читателя можно получить из активного потока для AsyncTask, он не будет иметь права на сбор мусора. Если вы беспокоитесь (или вы столкнулись с некоторой проблемой, которая заставляет вас поверить иначе), вы можете просто добавить явные ссылки на читателя в AsyncTask (GetHthmlTask). – FrankieTheKneeMan
@PatriciaShanahan Я завершил код для HtmlReader – BruceHill