29 अप्रैल '10 पर यानचेन के जवाब के संदर्भ में: 'डूइनब्लैकग्राउंड' के तहत आपके कोड को एसिंक्सटस्क के प्रत्येक निष्पादन के दौरान कई बार निष्पादित करने पर 'चल रहा है (चल रहा है)' दृष्टिकोण साफ है। यदि 'doInBackground' के तहत आपके कोड को AsyncTask के निष्पादन के अनुसार केवल एक बार निष्पादित किया जाना है, तो अपने सभी कोड को 'doInBackground' के तहत '' (चल रहा है) '' लूप में रखने पर बैकग्राउंड कोड (बैकग्राउंड थ्रेड) को चलने से रोका नहीं जाएगा जब AsyncTask को ही रद्द कर दिया गया है, क्योंकि T जबकि (चल रही है) ’स्थिति का मूल्यांकन केवल तब होगा जब लूप के अंदर के सभी कोड को कम से कम एक बार निष्पादित किया गया हो। आपको इस प्रकार या तो (a।) अपने कोड को 'doInBackground' के तहत एकाधिक में तोड़ देना चाहिए जबकि (चल रहा है) '(या) (b) कई' निष्पादित 'है।https://developer.android.com/reference/android/os/AsyncTask.html ।
विकल्प (ए) के लिए इस प्रकार यानचेन के उत्तर को इस प्रकार संशोधित किया जा सकता है:
public class MyTask extends AsyncTask<Void, Void, Void> {
private volatile boolean running = true;
//...
@Override
protected void onCancelled() {
running = false;
}
@Override
protected Void doInBackground(Void... params) {
// does the hard work
while (running) {
// part 1 of the hard work
}
while (running) {
// part 2 of the hard work
}
// ...
while (running) {
// part x of the hard work
}
return null;
}
// ...
विकल्प के लिए (b।) 'DoInBackground' में आपका कोड कुछ इस तरह दिखाई देगा:
public class MyTask extends AsyncTask<Void, Void, Void> {
//...
@Override
protected Void doInBackground(Void... params) {
// part 1 of the hard work
// ...
if (isCancelled()) {return null;}
// part 2 of the hard work
// ...
if (isCancelled()) {return null;}
// ...
// part x of the hard work
// ...
if (isCancelled()) {return null;}
}
// ...