Saya menggunakan AsyncTask
s untuk mengambil data sebagai respons terhadap pengguna yang menekan tombol. Ini berfungsi dengan baik dan menjaga antarmuka tetap responsif saat mengambil data, tetapi ketika saya memeriksa apa yang terjadi di debugger Eclipse, saya menemukan bahwa setiap kali yang baru AsyncTask
dibuat (yang cukup sering, karena mereka hanya dapat digunakan sekali ), utas baru sedang dibuat tetapi tidak pernah dihentikan.
Hasilnya adalah sejumlah besar AsyncTask
utas hanya duduk di sana. Saya tidak yakin apakah ini menjadi masalah dalam praktik atau tidak, tetapi saya benar-benar ingin menyingkirkan utas tambahan tersebut.
Bagaimana saya bisa membunuh utas ini?
android
multithreading
android-asynctask
Komputer
sumber
sumber
doInBackground
Metode selesai, tapi thread terus muncul di jendela debug. Misalnya:Thread [<23> AsyncTask #4](Running)
Jawaban:
AsyncTask
mengelola kumpulan utas, dibuat denganThreadPoolExecutor
. Ini akan memiliki 5 hingga 128 utas. Jika ada lebih dari 5 utas, utas ekstra itu akan bertahan paling lama 10 detik sebelum dilepas. (catatan: angka-angka ini untuk kode sumber terbuka yang saat ini terlihat dan bervariasi menurut rilis Android).AsyncTask
Tolong tinggalkan utasnya.sumber
AsyncTask
untuk sesuatu yang akan memakan waktu selama itu adalah ide yang buruk secara umum. Tapi tidak, komentar saya tentang utas tambahan akan hilang ketika tidak digunakan. Jadi, ketika salah satu dari 6 tugas Anda berakhir, utasnya akan tetap berada di kumpulan selama 10 detik, setelah itu utas itu akan dihentikan.AsyncTask
hari ini secara signifikan bukanlah rencana yang bagus. Memiliki 20+ yang dapat berjalan selama 10+ detik adalah hal yang seharusnya gagal dalam tinjauan kode. Jika Anda membuat 20 tugas secara berurutan, hanya beberapa yang akan dijalankan sekaligus, dan sisanya akan diantrekan untuk dieksekusi nanti. Berapa banyak yang akan dijalankan sekaligus didasarkan pada jumlah inti CPU. AFAIK, algoritme saat ini adalah 2N + 1 utas paralel, di mana N adalah jumlah inti.Selain tanggapan CommonsWare:
Saat ini saya menggunakan Android 2.2, dan aplikasi saya tidak menggunakan lebih dari satu AsyncTask setiap saat, tetapi saya membuat yang baru setiap x menit. Awalnya Utas AsyncTask baru mulai muncul (Utas baru untuk AsyncTask baru) tetapi setelah 5 utas (seperti yang disebutkan oleh CommonsWare), utas tersebut tetap terlihat di jendela debug, dan digunakan kembali saat utas AsyncTask baru diperlukan. Mereka hanya tetap di sana sampai debugger terputus.
sumber
Gejala yang sama di sini. Dalam kasus saya, utas berkeliaran setelah saya mematikan Aktivitas, dan saya berharap Aplikasi ditutup sepenuhnya. Masalah sebagian diselesaikan dengan menggunakan eksekutor utas tunggal:
Hal ini membuat utas menghilang setelah menyelesaikan pekerjaannya.
sumber
Gunakan ThreadPoolExecutor .
Posting
Runnable
tugas Anda dengan menggunakan metode execute () .Mengenai kueri kedua Anda:
Setelah Anda selesai dengan semua pekerjaan Anda
ThreadPoolExecutor
, matikan dengan benar seperti yang dikutip dalam posting di bawah ini:Cara mematikan Java ExecutorService dengan benar
sumber