অ্যাসিঙ্কটাস্কের অগ্নি-বিস্মৃত দৃষ্টান্তগুলির কারণগুলি স্টিভ প্রেন্টিসের উত্তরে বেশ ভালভাবে বিশদ দেওয়া হয়েছে - তবে, আপনি যখন কতবার এসআইএনসিটাস্ক চালাবেন তার উপর আপনি সীমাবদ্ধ থাকেন তবে থ্রেড চলমান অবস্থায় আপনি যা পছন্দ করেন তা করতে আপনি নির্দ্বিধায় .. ।
আপনার এক্সিকিউটেবল কোডটি ডোইনব্যাকগ্রাউন্ডের () এর মধ্যে একটি লুপের মধ্যে রাখুন এবং প্রতিটি সম্পাদনকে ট্রিগার করতে একটি যুগল লক ব্যবহার করুন। আপনি প্রকাশপ্রগ্রহ () / অনপ্রস্রেস আপডেট () ব্যবহার করে ফলাফল পুনরুদ্ধার করতে পারেন ।
উদাহরণ:
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 এর traditionalতিহ্যগত ব্যবহারের চেয়ে কিছুটা জটিল এবং আপনি প্রকৃত অগ্রগতি প্রতিবেদনের জন্য পাবলিশপ্রোগ্রেস () ব্যবহারটি ছেড়ে দেন । তবে যদি মেমোরিটি আপনার উদ্বেগের বিষয় হয়ে থাকে, তবে এই পদ্ধতিটি রানটাইমের সময় কেবলমাত্র একটি এ্যাসএনটাস্ক রয়ে গেছে the