Ini adalah pertanyaan yang sangat bagus, dibutuhkan waktu sebagai Pemrogram Android untuk sepenuhnya memahami masalahnya. Memang AsyncTask memiliki dua masalah utama yang berkaitan:
- Mereka kurang terikat dengan siklus hidup aktivitas
- Mereka membuat kebocoran memori dengan sangat mudah.
Di dalam aplikasi RoboSpice Motivations ( tersedia di Google Play ) kami menjawab pertanyaan itu secara rinci. Ini akan memberikan pandangan mendalam tentang AsyncTasks, Loader, fitur dan kekurangannya dan juga memperkenalkan Anda pada solusi alternatif untuk permintaan jaringan: RoboSpice. Permintaan jaringan adalah persyaratan umum di Android dan pada dasarnya operasi yang berjalan lama. Berikut adalah kutipan dari aplikasi:
AsyncTask dan siklus hidup Aktivitas
AsyncTasks tidak mengikuti siklus hidup instance Aktivitas. Jika Anda memulai AsyncTask di dalam sebuah Aktivitas dan Anda memutar perangkat, Aktivitas tersebut akan dimusnahkan dan sebuah instance baru akan dibuat. Tapi AsyncTask tidak akan mati. Itu akan terus hidup sampai selesai.
Dan setelah selesai, AsyncTask tidak akan memperbarui UI Aktivitas baru. Memang itu memperbarui contoh sebelumnya dari aktivitas yang tidak ditampilkan lagi. Hal ini dapat menyebabkan Pengecualian tipe java.lang.IllegalArgumentException: Tampilan tidak dilampirkan ke pengelola jendela jika Anda menggunakan, misalnya, findViewById untuk mengambil tampilan di dalam Aktivitas.
Masalah kebocoran memori
Sangat mudah untuk membuat AsyncTasks sebagai kelas dalam Aktivitas Anda. Karena AsyncTask perlu memanipulasi tampilan Aktivitas saat tugas selesai atau sedang berlangsung, penggunaan kelas dalam dari Aktivitas tampaknya nyaman: kelas dalam dapat mengakses langsung bidang apa pun dari kelas luar.
Namun demikian, itu berarti kelas dalam akan menyimpan referensi tak terlihat pada contoh kelas luarnya: Aktivitas.
Dalam jangka panjang, ini menghasilkan kebocoran memori: jika AsyncTask bertahan lama, itu membuat aktivitas "hidup" sedangkan Android ingin membuangnya karena tidak bisa lagi ditampilkan. Aktivitas tidak dapat dikumpulkan sampah dan itu adalah mekanisme utama Android untuk menjaga sumber daya di perangkat.
Ini benar-benar ide yang sangat buruk untuk menggunakan AsyncTasks untuk operasi yang berjalan lama. Namun demikian, mereka baik-baik saja untuk yang berumur pendek seperti memperbarui Tampilan setelah 1 atau 2 detik.
Saya mendorong Anda untuk mengunduh aplikasi RoboSpice Motivations , itu benar-benar menjelaskan hal ini secara mendalam dan memberikan contoh dan demonstrasi tentang berbagai cara untuk melakukan beberapa operasi latar belakang.
doInBackground
fungsi yang berjalan lama membekukan layar jika bilah kemajuan tidak digunakan.