2012-03-07 17 views
6

Bu kolay bir cevaba sahip olmalı, ancak bulamadım. Ve hala bir android manken olduğum için buraya insanlara sormak için geldim.Aynı anda çalıştırılacak bir AsyncTasks sınırı var mı?

Başlamada 10 AsyncTasks yürüten bu projeyi yapıyorum. Her görev, orada veri toplayan ve uygulamada önemli bir şey yapmayan 3 URL içerir (henüz).

Ben de AsyncTasks ilerleme takip etmek için kullanmak 10 textViews var.

bir görev uygun TextView'un "Başlat" alınır başlar

bir görev onun uygun TextView'un bir görev tamamlandığında bu

"bitirdi" kendi uygun TextView ayarlar "indirme" için ayarlar ilerliyor zaman

Gözlemlediğim ve AsyncTask hakkında soru sorduğum bu. Uygulamayı başlattığımda, "İndiriliyor" işaretine geçirilen 5 metin yorumunun dikkatini çektim. Bu nedenle, 5 AsyncTask'in işlerini gerektiği gibi yaptıklarını görüyorum. Tamamlandığında yeni bir AsyncTask başlatır. Yine de 5 AsynchTasks bu sınırı aynı anda çalışan neden Ne 5.

bu limitin üzerinde asla ulaşmıyor? Bunu neden bulamadığım bir dosyaya neden oldum? Bu bir android 2.3.3 limiti mi? Belki uygulamayı simüle etmek için kullandığım cihazın bir sınırı?

Herkes benim için detay verebilir mi?

+0

Bu soruya şu adreste ulaşılmaktadır: http://stackoverflow.com/questions/3077461/asynctask-threads-never-die-android – jengelsma

+0

@jengelsma Not really. Kesinlikle ilgili, ama neden 5'in üzerine çıkmıyor, neden 5'in altına düşmediğinden biraz daha farklı. Hala çekirdek havuzun büyüklüğü ile ilgisi var, ama bu soru/cevap, çekirdek havuzun boyutunun neden sınırlandığını açıklamıyor. max havuz boyutu 128 olduğunda eşzamanlı görevlerin sayısı 5. – kabuko

+0

AsyncTask.executeOnExecutor() yerine AsyncTask.execute() kullandığınızı düşünüyorum() –

cevap

8

Evet, bir sınır var. AsyncTask, bir çekirdek havuz boyutu 5 olan bir ThreadPoolExecutor destekli, ancak maksimum bir havuz boyutu 128 (1.6 - 4.0.3 arası), bu yüzden gerçekten 10 tanesini bir seferde görebilmeniz gerektiğini düşünürdüm. Gerçi değiştiremezsin. Eğer gerçekten farklı bir şey yapmak istiyorsanız (ve çok özel bir nedeniniz olmadığı sürece bunu tavsiye etmem), daha büyük bir havuz boyutuyla özel bir şey yapmanız veya sadece bir dizi ipliği elle döndürmeniz gerekir.

Güncelleme:

İşte

dokümanlar söylerler: maximumPoolSize ipler çalıştırmaktan daha corePoolSize fazla ama daha az varsa, yeni bir iş parçacığı kuyruğu dolu olması durumunda oluşturulacak

.

Yani işte bu yüzden. Sıranız dolu değil, bu yüzden sadece çekirdek havuz boyutunda tutar.

+0

İşte [AsyncTask] (http: // grepcode) kaynağına bir bağlantı referans için file/repository.grepcode.com/java/ext/com.google.android/android/1.6_r2/android/os/AsyncTask.java # AsyncTask). – kabuko

+2

AsyncTask öğelerinizin nasıl işlendiğini özelleştirmek isterseniz, isteğe bağlı bir "Executor" örneğini executeOnExecutor() öğesine sağlayabilirsiniz. – Argyle

+1

@Argyle iyi bir nokta; Bu API 11 ve üstü için iyi bir seçenek. – kabuko

0

ThreadPoolExecutor bir corePoolSize bir maxPoolSize ve QueueCapacity vardır. corePoolSize öğenizdeki tüm iş parçacıkları kullanılıyorsa, çekirdek havuzdaki her iş parçacığının kuyruğuna başka herhangi bir görev verilir. Bu sıralar dolduğunda, maxPoolSize'nin sınırları dahilinde olduğu sürece yeni bir iş parçacığı başlatılır. Buradaki yakalama, her bir iş parçacığının (programlı olarak değiştirilmedikçe) sıralarının UNBOUNDED olduğu yönündedir. Bu, çekirdek havuz boyutundaki tüm iş parçacıklarınızın kullanıldığını ve diğer görevlerin sıraya alındığı ve çekirdek iş parçacıklarından biri ile sıralarını beklediği anlamına gelir. Max havuz boyutuna ulaşma şansı bulamazlar.

Kendi Yürütücünüzü yapılandırmanız ve sıra kapasitesini değiştirmeniz gerekir. İyi şanslar!

İlgili konular