Bu çok güzel bir soru, bir Android Programcısı olarak sorunu tam olarak anlamak zaman alıyor. Indeed AsyncTask'ın birbiriyle ilişkili iki ana sorunu vardır:
- Aktivite yaşam döngüsüne zayıf bir şekilde bağlılar
- Çok kolay bellek sızıntıları yaratırlar.
İçinde RoboSpice (Motivasyonları uygulamasında Google Play'de sunulan ) detaylı olarak bu soruya cevap. AsyncTasks, Loaders, özellikleri ve dezavantajları hakkında derinlemesine bir görünüm sunacak ve ayrıca ağ talepleri için alternatif bir çözüm sunacaktır: RoboSpice. Ağ istekleri Android'de yaygın bir gereksinimdir ve doğası gereği uzun süren işlemlerdir. İşte uygulamadan bir alıntı:
AsyncTask ve Activity yaşam döngüsü
AsyncTasks, Etkinlik örneklerinin yaşam döngüsünü izlemez. Bir Activity içinde bir AsyncTask başlatırsanız ve cihazı döndürürseniz, Aktivite yok edilecek ve yeni bir örnek oluşturulacaktır. Ancak AsyncTask ölmeyecek. Tamamlanana kadar yaşamaya devam edecek.
Ve tamamlandığında, AsyncTask yeni Aktivitenin kullanıcı arayüzünü güncellemez. Aslında, artık görüntülenmeyen etkinliğin önceki örneğini günceller. Bu, java.lang.IllegalArgumentException türünde bir İstisnaya yol açabilir: Örneğin, Activity içinde bir görünümü almak için findViewById kullanıyorsanız, pencere yöneticisine görünüm eklenmez.
Bellek sızıntısı sorunu
AsyncTasks'i Etkinliklerinizin iç sınıfları olarak oluşturmak çok uygundur. AsyncTask'ın, görev tamamlandığında veya devam ederken Aktivite görünümlerini manipüle etmesi gerekeceğinden, Aktivitenin bir iç sınıfını kullanmak uygun görünmektedir: iç sınıflar, dış sınıfın herhangi bir alanına doğrudan erişebilir.
Bununla birlikte, bu, iç sınıfın, dış sınıf örneğinde görünmez bir referans tutacağı anlamına gelir: Activity.
Uzun vadede, bu bir bellek sızıntısı yaratır: AsyncTask uzun sürerse, etkinliği "canlı" tutarken, Android artık görüntülenemediği için ondan kurtulmak ister. Etkinlik çöp olarak toplanamaz ve bu, Android'in cihazdaki kaynakları korumak için merkezi bir mekanizmadır.
Uzun süre çalışan işlemler için AsyncTasks kullanmak gerçekten çok çok kötü bir fikir. Yine de, 1 veya 2 saniye sonra bir Görünümü güncelleme gibi kısa ömürlü olanlar için iyidirler.
RoboSpice Motivations uygulamasını indirmenizi tavsiye ediyorum , bu gerçekten bunu derinlemesine açıklıyor ve bazı arka plan işlemlerini yapmanın farklı yollarının örneklerini ve gösterilerini sağlıyor.
doInBackground
, bir ilerleme çubuğu kullanılmadığında uzun süre çalışan işlevin ekranı dondurmasıydı.