Tham khảo câu trả lời của Yanchenko vào ngày 29 tháng 4 năm 10: Sử dụng cách tiếp cận 'trong khi (đang chạy)' rất gọn gàng khi mã của bạn trong 'doInBackground' phải được thực thi nhiều lần trong mỗi lần thực thi AsyncTask. Nếu mã của bạn trong 'doInBackground' chỉ được thực thi một lần cho mỗi lần thực thi AsyncTask, việc gói tất cả mã của bạn trong 'doInBackground' trong một vòng lặp 'while (đang chạy)' sẽ không ngăn mã nền (chuỗi nền) chạy khi Bản thân AsyncTask bị hủy, vì điều kiện 'while (đang chạy)' sẽ chỉ được đánh giá khi tất cả mã bên trong vòng lặp while đã được thực thi ít nhất một lần. Do đó, bạn nên (a.) Chia nhỏ mã của mình trong 'doInBackground' thành nhiều khối 'trong khi (đang chạy)' hoặc (b.) Thực hiện nhiều 'isCancelt'https://developer.android.com/reference/android/os/AsyncTask.html .
Đối với tùy chọn (a.) Do đó, người ta có thể sửa đổi câu trả lời của Yanchenko như sau:
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;
}
// ...
Đối với tùy chọn (b.), Mã của bạn trong 'doInBackground' sẽ trông giống như sau:
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;}
}
// ...