Dalam Aktivitas saya, saya menggunakan kelas yang memanjang dari AsyncTask dan parameter yang merupakan instance dari AsyncTask itu. Ketika saya menelepon mInstanceOfAT.execute("")
semuanya baik-baik saja. Tetapi aplikasi mogok ketika saya menekan tombol pembaruan yang memanggil lagi AsyncTask (Jika pekerjaan jaringan tidak bekerja). Karena kemudian muncul Pengecualian yang mengatakan
Tidak dapat menjalankan tugas: tugas sudah dijalankan (tugas hanya dapat dilakukan sekali)
Saya sudah mencoba menelepon cancel (true) untuk instance Asyctask, tetapi tidak berhasil juga. Satu-satunya solusi sejauh ini adalah membuat instance baru dari Asyntask. Apakah itu cara yang benar?
Terima kasih.
sumber
Alasan untuk contoh ASyncTask yang mudah-dan-terinci dijelaskan dengan sangat baik dalam jawaban Steve Prentice - Namun, sementara Anda dibatasi pada berapa kali Anda menjalankan ASyncTask, Anda bebas untuk melakukan apa yang Anda suka saat utas berjalan. .
Masukkan kode yang dapat dieksekusi di dalam loop di dalam doInBackground () dan gunakan kunci bersamaan untuk memicu setiap eksekusi. Anda dapat mengambil hasilnya menggunakan publishProgress () / onProgressUpdate () .
Contoh:
Tentu saja, ini sedikit lebih rumit daripada penggunaan tradisional ASyncTask, dan Anda berhenti menggunakan publishProgress () untuk pelaporan kemajuan aktual. Tetapi jika memori menjadi perhatian Anda, maka pendekatan ini akan memastikan hanya satu ASyncTask yang tersisa di heap saat runtime.
sumber
IllegalMonitorStateException
dalamrunAgain
(disebut olehonProgressUpdate
) melihat jawaban ini: stackoverflow.com/a/42646476/2711811 . Ini menunjukkan (dan bekerja untuk saya) bahwasignal()
kebutuhan untuk dikelilingi olehlock
/unlock
. Ini mungkin ada hubungannya dengan waktupublishProgress
panggilanonProgressUpdate
.Saya memiliki masalah yang sama. Dalam kasus saya, saya punya tugas yang ingin saya lakukan di dalam
onCreate()
dan dionResume(
). Jadi saya membuat Asynctask saya statis, dan dapatkan instance darinya. Sekarang kami masih memiliki masalah yang sama.Jadi yang saya lakukan di onPostExecute () adalah ini:
Perlu diingat bahwa saya memeriksa metode getInstance statis bahwa instance saya tidak nol, kalau tidak saya membuatnya:
Metode di postExecute akan mengosongkan instance dan membuatnya kembali. Tentu ini bisa dilakukan di luar kelas.
sumber
Saya telah membuat tugas rotasi saya statis, yang kemudian membantu saya melampirkan, melepaskan, dan memasang kembali ke utas UI pada perubahan rotasi. Tetapi untuk kembali ke pertanyaan Anda, apa yang saya lakukan adalah membuat bendera untuk melihat apakah utas berjalan. Ketika Anda ingin memulai kembali utas, saya memeriksa apakah tugas rotasi berjalan jika saya memanggang peringatan. Jika tidak, saya membuatnya nol dan kemudian membuat yang baru, yang akan mengatasi kesalahan yang Anda lihat. Selanjutnya, setelah berhasil menyelesaikan saya membatalkan tugas sadar rotasi selesai sehingga siap untuk pergi lagi.
sumber
Ya itu benar, dokter mengatakan bahwa hanya dapat dieksekusi satu Asyntask.
Setiap kali Anda perlu menggunakannya, Anda harus misalnya:
sumber