it-swarm-id.com

Bagaimana cara menghentikan asynctask di android?

Saya ingin menghentikan utas AsyncTask dari utas lain AsyncTask. Saya telah mencoba seperti new AsyncTask.cancel(true) untuk menghentikan proses latar belakang tetapi tidak berhenti.

Adakah yang bisa membantu saya dalam hal ini?

54
user

nyatakan asyncTask Anda dalam aktivitas Anda:

private YourAsyncTask mTask;

instantiate seperti ini:

mTask = new YourAsyncTask().execute();

bunuh/batalkan seperti ini:

mTask.cancel(true);
103
Yashwanth Kumar

Alasan mengapa hal-hal tidak berhenti untuk Anda adalah karena proses (doInBackground ()) berjalan sampai selesai. Karena itu Anda harus memeriksa apakah utas dibatalkan atau tidak sebelum melakukan hal-hal:

if(!isCancelled()){
// Do your stuff
}

Jadi pada dasarnya, jika utasnya tidak dibatalkan, lakukan, lewati saja :) Bisa bermanfaat untuk memeriksa ini beberapa kali selama operasi Anda, terutama sebelum waktu mengambil barang.

Juga bisa berguna untuk "membersihkan" sedikit

onCancelled();

Dokumentasi untuk AsyncTask:

http://developer.Android.com/reference/Android/os/AsyncTask.html

Semoga ini membantu!

20
DecodeGnome

Anda mungkin juga harus menggunakannya di onPause atau onDestroy dari Activity Siklus Hidup:

//you may call the cancel() method but if it is not handled in doInBackground() method
if (loginTask != null && loginTask.getStatus() != AsyncTask.Status.FINISHED)
    loginTask.cancel(true);

di mana loginTask adalah objek dari AsyncTask Anda

Terima kasih.

Anda tidak bisa langsung membunuh asynctask. Untuk menghentikannya, Anda harus terlebih dahulu membatalkannya:

task.cancel(true);

dan daripada di asynctask's doInBackground () periksa metode apakah sudah dibatalkan:

isCancelled()

dan jika ya, hentikan eksekusi secara manual.

6
user2758776

Saya memiliki masalah yang sama - pada dasarnya saya mendapatkan NPE dalam tugas async setelah pengguna menghancurkan fragmen. Setelah meneliti masalah pada Stack Overflow, saya mengadopsi solusi berikut:

volatile boolean running;

public void onActivityCreated (Bundle savedInstanceState) {

    super.onActivityCreated(savedInstanceState);

    running=true;
    ...
    }


public void onDestroy() {
    super.onDestroy();

    running=false;
    ...
}

Kemudian, saya memeriksa "jika menjalankan" secara berkala dalam kode async saya. Saya telah stres menguji ini dan saya sekarang tidak dapat "merusak" aktivitas saya. Ini berfungsi dengan baik dan memiliki keuntungan lebih sederhana daripada beberapa solusi yang saya lihat di SO.

1
IanB