Alasan untuk contoh ASyncTask yang mudah-dan-terinci dijelaskan dengan sangat baik dalam jawaban Steve Prentice - Namun, sementara Anda dibatasi pada berapa kali Anda menjalankan ASyncTask, Anda bebas untuk melakukan apa yang Anda suka saat utas berjalan. .
Masukkan kode yang dapat dieksekusi di dalam loop di dalam doInBackground () dan gunakan kunci bersamaan untuk memicu setiap eksekusi. Anda dapat mengambil hasilnya menggunakan publishProgress () / onProgressUpdate () .
Contoh:
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();
}
}
Tentu saja, ini sedikit lebih rumit daripada penggunaan tradisional ASyncTask, dan Anda berhenti menggunakan publishProgress () untuk pelaporan kemajuan aktual. Tetapi jika memori menjadi perhatian Anda, maka pendekatan ini akan memastikan hanya satu ASyncTask yang tersisa di heap saat runtime.