Powody wystrzeliwania i zapomnienia instancji ASyncTask są dość dobrze opisane w odpowiedzi Steve'a Prentice'a - jednak chociaż jesteś ograniczony co do tego, ile razy wykonujesz ASyncTask, możesz robić, co chcesz, podczas gdy wątek jest uruchomiony. .
Umieść swój kod wykonywalny w pętli wewnątrz metody doInBackground () i użyj blokady współbieżnej, aby wyzwolić każde wykonanie. Wyniki można pobrać za pomocą funkcji publicProgress () / onProgressUpdate () .
Przykład:
class GetDataFromServerTask extends AsyncTask<Input, Result, Void> {
private final ReentrantLock lock = new ReentrantLock();
private final Condition tryAgain = lock.newCondition();
private volatile boolean finished = false;
@Override
protected Void doInBackground(Input... params) {
lock.lockInterruptibly();
do {
Result result = ....
publishProgress(result);
tryAgain.await();
} while(!finished);
lock.unlock();
}
@Override
protected void onProgressUpdate(Result... result)
{
if (result != whatWeWant && userWantsToTryAgain()) {
runAgain();
}
}
public void runAgain() {
tryAgain.signal();
}
public void terminateTask() {
finished = true;
lock.unlock();
}
@Override
protected void onCancelled() {
terminateTask();
}
}
Oczywiście jest to nieco bardziej skomplikowane niż tradycyjne użycie ASyncTask i rezygnuje się z użycia funkcji PublishProgress () do raportowania rzeczywistych postępów. Ale jeśli martwisz się pamięcią, to podejście zapewni, że tylko jedno ASyncTask pozostanie w stercie w czasie wykonywania.