2012-12-17 20 views
20

Uygulamamda, uygulamayı başlattığımda AsyncTask kullanarak bazı şeyler yapan bir SplashActivity var.paralel çalışıyor AsyncTask

Ayrıca, sunucudan veri indiren başka bir AsyncTask oluşturdum. Şimdi uygulamamı kapattıktan sonra AsyncTask hala verileri indiriyor.

Ancak yine de uygulamamı başlattığımda, SplashActivity'nin AsyncTask benim downloader AsyncTask tamamlanıncaya ve uygulamam askıya alınana kadar arka planını (doInBackground işlevi) yürütmez.

Benim sorum şu ki, iki AsyncTask'ı paralel olarak çalıştıramıyoruz? Her iki AsyncTask farklı ve kendi eşyalarını yapıyorlar. Bunu yapmanın bir yolu var mı?

+0

ilgili kod (Görevler ve çağırma Aktivite) gönderilmesi için lütfen –

cevap

30

AsyncTask'u yürütmek için thread pool Executor kullanmanız gerekir. Standart uygulama Yani bir ThreadPoolExecutor oluşturmak ve daha sonra kullanmak tek iplik

üzerinde çalışan bir seri vasisi kullanır

AsyncTask en executeOnExecutor yerine yöntemi

+0

bu yöntemi kullanarak dezavantajı çeşit var mıdır. Yani AsyncTask'ı paralel hale getirerek fazladan iş yapmak zorunda mısın? –

+2

@ Gee.E varsayılan yürütücüyü kullanarak daha iyi olduğundan, yalnızca tek bir iş parçacığı olduğundan, aynı anda çok fazla göreviniz yoksa, varsayılan yürütücü daha iyi bir performans sağlar, ancak çok fazla zaman alan bir asenkronizasyon varsa zaman, bir ThreadPoolExecutor – nandeesh

+0

@ nandeesh Roger gerekebilir, ben önbelleğe alınmış bir veritabanından veri almak için paralel görevi kullanıyorum. Karmaşık nedenlerden ötürü, paralel çalışmak için getirici-görevine ihtiyacım var, ama gereken zaman göz ardı edilebilir olduğundan, herhangi bir performans düşüşü görmüyorum. Yine de, konuyu açıkladığınız için teşekkürler. –

35

Petek sürümden AsyncTask bir değişiklik olmamıştır yürütmek ait. Eski sürümlerde 10 iş parçacığı bir iş parçacığı havuzu vardı, bu nedenle 10 görevi paralel olarak çalıştırabilirsiniz. Ancak Honeycomb ve up için varsayılan, görevleri tek tek yürüten bir seri yürütücüsüdür. Ama yürütülmesi için bir ThreadPoolExecutor geçirebilirsiniz:

if (Build.VERSION.SDK_INT >= 11) { 
    //--post GB use serial executor by default -- 
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
    } else { 
    //--GB uses ThreadPoolExecutor by default-- 
    task.execute(); 
    } 
+3

Son argümanı belirtmeniz gerekmez 'new Void [] {}'; ihmal etmek yeterli olacaktır. –

+0

IDE'niz yanlış; varargs, diziler oluşturmak için kısayollardır, dolayısıyla parametre listesi boş olabilir. Aslında, sahip olduğunuz gibi yeni bir dizi sağlamak aslında kötü bir uygulamadır; Bir nesneyi gereksiz yere örneklendiriyorsunuz. GC'nin tekrar gelmesi ve uygulamanızı birkaç milisaniye tekrar duraklatması gerekecek. –

+0

Teşekkürler! ÇALIŞIYOR bir cazibe gibi. Ve Android dokümantasyon bu konuda daha net olamazdı: "public static final Executor THREAD_POOL_EXECUTOR. API düzey 11'de eklendi - Görevleri paralel olarak yürütmek için kullanılabilecek bir Executor." – Luis

5

Diğer bir seçenek destek v.4 kütüphanesinden AsyncTaskCompat kullanıyor.

AsyncTaskCompat.executeParallel(new AsyncTask<Void, Void, Object>() { 
    @Override 
    protected Object doInBackground(Void... params) { 
     // do your parallel task here 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Object result) { 
     // and fetch result 
    } 
}); 
+1

Bu sınıf API düzeyinde 26 Deprecate ve API düzeyinde 27 kaldırıldı –