Android'de Asynctask vs Thread


135

Kullanıcı arayüzünde, arka plan çalışması yapmak için ayrı bir yöntem kullandım Thread. Ama başkalarının önerdiği gibi, şimdi kullanıyorum AsyncTask.

A Threadve an arasındaki temel fark nedir AsyncTask?

Hangi senaryoda a Threadveya an kullanmalıyım AsyncTask?



@ webaldo.at Bunu ben reffered, burada Asynctask ve Thread arasında açıklama ve fark girin verdiler.Örneğin ağ bağlantısı, dosya ne kullandığımı okumak için hangi durumda bilmek istiyorum ?.
Ram

Kısaltılmış: Konu -> Kullanıcı Arayüzüne Erişim Yok || Asynctask -> Kullanıcı Arabirimine Koşullu Erişim
JavaDM

arka plan görevi için IntentService başka bir güzel seçenektir.
Chen

Yanıtlar:


146

Uzun süren veya CPU yoğunluklu görevler için, bunu yapmanın temel olarak iki yolu vardır: Java iş parçacıkları ve Android'in yerel AsyncTask'ı.

Her ikisi de diğerinden daha iyi değildir, ancak her bir çağrıyı ne zaman kullanacağınızı bilmek, sistemin performansını sizin yararınıza kullanmak için önemlidir.

AsyncTask'ı aşağıdakiler için kullanın:

  1. Çok fazla veri indirilmesini gerektirmeyen basit ağ işlemleri
  2. Birkaç milisaniyeden fazla sürebilecek diske bağlı görevler

Java iş parçacıklarını şunlar için kullanın:

  1. Orta ila büyük miktarda veri içeren ağ işlemleri (yükleme veya indirme)
  2. Arka planda çalıştırılması gereken yüksek CPU görevleri
  3. GUI iş parçacığına göre CPU kullanımını denetlemek istediğiniz herhangi bir görev

İnternet üzerinden size yardımcı olabilecek birçok iyi kaynak vardır:

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html


İndirme veri miktarının neden bir sorun olduğunu sorabilir miyim?
Yeung

1
@Yeung Async Task hakkında bilgi sahibi olmanız gerekiyor gibi görünüyor! Bakın, veri miktarı arttıkça, aynı işlemi tamamlamak için gereken süre de belirgin şekilde artar. Bu nedenle, aşağıdaki nedenlerden dolayı Async Task kullanarak uzun süre çalışan bir işlem yapmak iyi bir uygulama değildir: 1. Async Task, Activity yaşam döngüsüne zayıf bağlıdır. 2. Meomory kaçakları oluştururlar.
Mohit


Teşekkür ederim. Riski şimdi anlıyorum.
Yeung

@Impasse @Yeung IMO veri miktarı bir sorun değil, ağ operasyonları ile ilgili önemli sorun operasyon zamanı. Birkaç baytın indirilmesi bile sunucu meşgul olduğunda, ulaşılamadığında (zaman aşımı) vb. Uzun zaman alabilir. Bir düzeltme AsyncTaskkendi zamanlayıcı ile kullanmak olabilir .
xmedeko

44

Java iş parçacıklarını kullanıyorsanız, kendi kodunuzda aşağıdaki gereksinimleri karşılamanız gerekir:

Sonuçları kullanıcı arayüzüne geri gönderirseniz ana iş parçacığıyla senkronizasyon

İleti dizisini iptal etmek için varsayılan değer yok

Varsayılan iş parçacığı havuzu yok

Android'de yapılandırma değişikliklerini işlemek için varsayılan değer yok


3
bu aslında daha açıklayıcıdır çünkü basit konuları kullanmamanın nedenlerini ele almaktadır. Aklımın en tepesinden, Faaliyet / Hizmet yaşam döngüsüne bağlanması gereken her şey yerine AsyncTask kullanmalı, ancak görev içindeki kaynakları elle "zarif bir şekilde düşürmeniz" gerekse, en azından görev askıya almıyorsunuz faaliyet öldürüldüğünde.
leRobot

28

Konu

  • Genel olarak uzun görev
  • Thread.start () yöntemiyle çağır
  • Herhangi bir iş parçacığından tetiklenir
  • Onun üzerinde çalışır kendi iplik
  • Manuel iş parçacığı yönetimi / kodunun okunması zorlaşabilir

AsyncTask

  • Küçük görevAna iş parçacığı ile iletişim kurmak zorunda
  • Excute () yöntemiyle çağır
  • Ana iplikten tetiklenir
  • İş parçacığı üzerinde çalışır
  • Ana iş parçacığından yürütülmeli ve oluşturulmalıdır

11

Konu

Bir iş parçacığı, eşzamanlı bir yürütme birimidir. Kendi çağrı yığını vardır. Uygulamalarda diş açmanın iki yöntemi vardır.

Bunlardan biri, Thread'ı genişleten ve run () yöntemini geçersiz kılan yeni bir sınıf sağlamaktır. Diğeri, oluşturma sırasında Runnable nesnesiyle yeni bir Thread örneği sağlıyor. Bir iş parçacığı, "start" yöntemi çağrılarak yürütülebilir. Bir iş parçacığının "Önceliği" ni "setPriority (int)" yöntemini çağırarak ayarlayabilirsiniz.

Kullanıcı arabirimi bölümünde herhangi bir etkiniz yoksa bir iş parçacığı kullanılabilir. Örneğin, bir web servisini çağırıyor veya bazı verileri indiriyorsunuz ve indirdikten sonra, bunu ekranınızda görüntülüyorsunuz. Sonra bir iş parçacığı ile işleyici kullanmanız gerekir ve bu, Threads tüm yanıtları işlemek için uygulama karmaşık hale getirecektir.

Bir işleyici, bir iş parçacığının MessageQueue ile ilişkili Message ve Runnable nesneleri göndermenizi ve işlemenizi sağlar. Her ileti dizisinin her bir ileti kuyruğu vardır. (Yapılacaklar Listesi gibi) ve iş parçacığı her iletiyi alacak ve ileti kuyruğu boşalana kadar işleyecektir. Böylece, İşleyici iletişim kurduğunda, sadece arayan iş parçacığına bir mesaj verir ve işlemek için bekler.

Java iş parçacıklarını kullanıyorsanız, kendi kodunuzda aşağıdaki gereksinimleri karşılamanız gerekir:

Sonuçları kullanıcı arayüzüne geri gönderirseniz ana iş parçacığıyla eşitleme İş parçacığını iptal etmek için varsayılan yok Varsayılan iş parçacığı havuzu yok Android'de yapılandırma değişikliklerini işlemek için varsayılan yok

AsyncTask

AsyncTask, UI iş parçacığının düzgün ve kolay kullanımını sağlar. Bu sınıf, iş parçacıklarını ve / veya işleyicileri değiştirmek zorunda kalmadan arka plan işlemlerini gerçekleştirmeye ve sonuçları UI iş parçacığında yayınlamaya izin verir. Zaman uyumsuz bir görev, bir arka plan iş parçacığında çalışan ve sonucu UI iş parçacığında yayınlanan bir hesaplama ile tanımlanır.

AsyncTask aşağıdaki 4 aşamadan geçecektir:

OnPreExecute ()

Görev yürütülmeden UI iş parçacığında çağrılır

doInbackground (Parametreler ..)

OnPreExecute () işlemi tamamlandıktan hemen sonra arka plan iş parçacığında çağrılır.

onProgressUpdate (Gelişme ..)

PublishProgress (İlerleme ...) çağrısından sonra UI iş parçacığında çağrılır.

OnPostExecute (Sonuç)

Arka plan hesaplaması bittikten sonra UI iş parçacığında çağrılır.

Neden AsyncTask kullanmalısınız?

Bir UI İş Parçacığı için kullanımı kolaydır. (Bu nedenle, arayan iş parçacığı bir UI iş parçacığı olduğunda kullanın).

İşleyicileri manipüle etmeye gerek yok.

Ayrıntılı bilgiler için bakınız Burada


2

Konu:

Threadperformansın iyileştirilmesi için uzun çalışma operasyonlarını ana dişten ayırmak için kullanılmalıdır. Ancak zarif bir şekilde iptal edilemez ve Android'in yapılandırma değişikliklerini gerçekleştiremez. Kullanıcı arayüzünü adresinden güncelleyemezsiniz Thread.

AsyncTask5 ms'den daha kısa iş parçalarını işlemek için kullanılabilir. İle AsyncTask, java'nın aksine UI'yi güncelleyebilirsiniz Thread. Ancak uzun süren birçok görev performansı boğacaktır.

Her ikisine de birkaç alternatifiniz var.

HandlerThread / Handler ve ThreadPoolExecutor

Daha fazla ayrıntı için aşağıdaki gönderiye bakın:

İşleyici vs AsyncTask vs Konu

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.