Steve Prentice의 답변에 ASyncTask 인스턴스가 발생하는 이유가 자세히 설명되어 있습니다. 그러나 ASyncTask를 실행하는 횟수 가 제한되어 있지만 스레드가 실행되는 동안 원하는 작업을 자유롭게 수행 할 수 있습니다. .
실행 코드를 doInBackground () 내의 루프 안에 넣고 동시 잠금을 사용하여 각 실행을 트리거하십시오. publishProgress () / onProgressUpdate ()를 사용하여 결과를 검색 할 수 있습니다 .
예:
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 {
// This is the bulk of our task, request the data, and put in "result"
Result result = ....
// Return it to the activity thread using publishProgress()
publishProgress(result);
// At the end, we acquire a lock that will delay
// the next execution until runAgain() is called..
tryAgain.await();
} while(!finished);
lock.unlock();
}
@Override
protected void onProgressUpdate(Result... result)
{
// Treat this like onPostExecute(), do something with result
// This is an example...
if (result != whatWeWant && userWantsToTryAgain()) {
runAgain();
}
}
public void runAgain() {
// Call this to request data from the server again
tryAgain.signal();
}
public void terminateTask() {
// The task will only finish when we call this method
finished = true;
lock.unlock();
}
@Override
protected void onCancelled() {
// Make sure we clean up if the task is killed
terminateTask();
}
}
물론 이것은 기존의 ASyncTask 사용법보다 약간 더 복잡 하며 실제 진행률보고 에 publishProgress () 사용을 포기합니다 . 그러나 메모리가 중요한 경우이 방법을 사용하면 런타임시 하나의 ASyncTask 만 힙에 남아있게됩니다.