อ้างอิงถึงคำตอบของ Yanchenko ในวันที่ 29 เมษายน 2553: การใช้วิธีการ 'while (running)' เป็นไปอย่างเรียบร้อยเมื่อโค้ดของคุณภายใต้ "doInBackground" ต้องดำเนินการหลายครั้งในระหว่างการดำเนินการ AsyncTask ทุกครั้ง หากโค้ดของคุณภายใต้ 'doInBackground' ต้องดำเนินการเพียงครั้งเดียวต่อการเรียกใช้ AsyncTask การตัดโค้ดทั้งหมดของคุณภายใต้ 'doInBackground' ในลูป 'while (running)' จะไม่หยุดการทำงานของโค้ดพื้นหลัง (เธรดพื้นหลัง) เมื่อ AsyncTask นั้นถูกยกเลิกเนื่องจากเงื่อนไข 'while (running)' จะได้รับการประเมินก็ต่อเมื่อโค้ดทั้งหมดภายในลูป while ถูกเรียกใช้งานอย่างน้อยหนึ่งครั้ง ดังนั้นคุณควร (a.) แบ่งโค้ดของคุณภายใต้ 'doInBackground' เป็นหลาย ๆ 'while (running)' blocks หรือ (b.) ทำการ 'isCancelled' จำนวนมากhttps://developer.android.com/reference/android/os/AsyncTask.html
สำหรับตัวเลือก (a.) คุณสามารถแก้ไขคำตอบของ Yanchenko ได้ดังนี้:
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;}
}
// ...