AsyncTask <arg1, arg2, arg3> 'a hangi argümanlar iletilir?


157

Buraya ne koymam gerektiğini ve bu argümanların nerede ortaya çıktığını anlamıyorum? Tam olarak ne koymalıyım ve tam olarak nereye gidecek? Tüm 3'leri içermeli miyim yoksa 1,2,20 ekleyebilir miyim?

Yanıtlar:


496

Google'ın Android Belgeleri şunları söylüyor:

Eşzamansız görev, Params, Progress ve Result adlı 3 genel tür ve onPreExecute, doInBackground, onProgressUpdate ve onPostExecute adlı 4 adımla tanımlanır.

AsyncTask'in genel türleri:

Zaman uyumsuz bir görev tarafından kullanılan üç tür şunlardır:

Params, the type of the parameters sent to the task upon execution.
Progress, the type of the progress units published during the background computation.
Result, the type of the result of the background computation.

Tüm türler her zaman zaman uyumsuz bir görev tarafından kullanılmaz. Bir türü kullanılmamış olarak işaretlemek için Void türünü kullanmanız yeterlidir:

 private class MyTask extends AsyncTask<Void, Void, Void> { ... }

Ayrıca başvurabilirsiniz: http://developer.android.com/reference/android/os/AsyncTask.html

Ya da Sankar- Ganesh'in Bloguna başvurarak AsyncTask'ın rolünü nasıl temizleyebilirsiniz?

Peki tipik bir AsyncTask sınıfının yapısı şöyle:

private class MyTask extends AsyncTask<X, Y, Z>

    protected void onPreExecute(){

    }

Bu yöntem yeni İş Parçasını başlatmadan önce yürütülür. Hiçbir giriş / çıkış değeri yoktur, bu nedenle değişkenleri veya yapmanız gereken her şeyi başlatın.

    protected Z doInBackground(X...x){

    }

AsyncTask sınıfındaki en önemli yöntem. Burada arka planda yapmak istediğiniz tüm şeyleri, ana olandan farklı bir iş parçacığına yerleştirmelisiniz. Burada girdi değeri olarak “X” türünden bir nesne dizisine sahibiz (Başlıkta görüyor musunuz? “... AsyncTask” ı genişletiyor Bunlar girdi parametrelerinin TÜRLERİ) ve türden bir nesne döndürüyor “Z”.

   protected void onProgressUpdate(Y y){

   }

Bu yöntem publishProgress (y) yöntemi kullanılarak çağrılır ve genellikle arka planda yaptığınız işlemin ilerlemesini gösteren bir ilerleme çubuğu gibi ana ekranda herhangi bir ilerleme veya bilgi göstermek istediğinizde kullanılır.

  protected void onPostExecute(Z z){

  }

Bu yöntem, arka plandaki işlem yapıldıktan sonra çağrılır. Bir girdi parametresi olarak, doInBackground yönteminin çıktı parametresini alırsınız.

X, Y ve Z tipleri ne olacak?

Yukarıdaki yapıdan çıkarabileceğiniz gibi:

 X  The type of the input variables value you want to set to the background process. This can be an array of objects.

 Y  The type of the objects you are going to enter in the onProgressUpdate method.

 Z  The type of the result from the operations you have done in the background process.

Bu görevi bir dış sınıftan nasıl adlandırırız? Sadece aşağıdaki iki satırla:

MyTask myTask = new MyTask();

myTask.execute(x);

Burada x, X tipinin giriş parametresidir.

Görevimizi yerine getirdikten sonra, durumunu “dışarıdan” öğrenebiliriz. “GetStatus ()” yöntemini kullanarak.

 myTask.getStatus();

ve aşağıdaki durumu alabiliriz:

ÇALIŞIYOR - Görevin çalıştığını gösterir.

BEKLİYOR - Görevin henüz yürütülmediğini gösterir.

FINISHED - onPostExecute (Z) işleminin tamamlandığını gösterir.

AsyncTask kullanımı hakkında ipuçları

  1. PrePecExecute, doInBackground ve onPostExecute yöntemlerini manuel olarak çağırmayın. Bu sistem tarafından otomatik olarak yapılır.

  2. Bir AsyncTask'ı başka bir AsyncTask veya İş Parçasının içine çağıramazsınız. Yürütme yönteminin çağrısı UI iş parçacığında yapılmalıdır.

  3. OnPostExecute yöntemi UI iş parçacığında yürütülür (burada başka bir AsyncTask! Çağırabilirsiniz!).

  4. Görevin giriş parametreleri bir Nesne dizisi olabilir, bu şekilde istediğiniz nesne ve türleri koyabilirsiniz.


20
Mükemmel açıklama ahbap
Kalai.G

30
Google'dan daha iyi.
Diolor

25
+1. SO üyeleri, not alın. İşte böyle açıklarsınız. Uzun olmasına rağmen, anlaşılması son derece kolaydır. Teşekkürler Kartik.
Subby

3
Güzel açıklama, şimdi Asyntask hakkında çok açıkım. :) Teşekkürler Kartik
Reena

2
Bu benim için bir çok şeyi temizledi, harika cevap!
Michael

80

Partiye çok geç kaldım ama bunun birine yardımcı olabileceğini düşündüm.


7
Bu görsel son derece yardımcı oldu. Kod akışı kolay olmadığında veya teknik veya desen nadir olduğunda nasıl Türleri ve ilgili değişkenleri birbirine bağlı olduğunu göstermek için böyle daha fazla görsel kullanmaya başlayacağım. Umarım diğerleri bundan daha fazlasını yapar. Teşekkürler
Kent Lauridsen

Güzel görseller, lütfen WeakAsyncTask için de ekleyebilir misiniz?
kAmol

1
Emin @kAmol, ben bir akış yapmaya çalışacağım WeakAsyncTasksıra
mrid

4
Bir gün bunu çerçeveleyeceğim ve duvarıma koyacağım, böylece referans için bu konuya geri dönmeye devam etmem gerekmiyor.
Matt Robertson

14

Basit tutun!

Bir AsyncTaskarka plan iş parçacığında çalışan bir arka plan görevidir. Girdi alır , İlerleme gerçekleştirir ve Çıktı verir .

yani AsyncTask<Input,Progress,Output>.

Kanımca ana karışıklık kaynağı, içindeki parametreleri ezberlemeye çalıştığımızda geliyor AsyncTask.
Anahtar ezberleme .
Görevinizin gerçekten ne yapması gerektiğini görselleştirebiliyorsanız AsyncTask, doğru imzayla yazmak bir parça kek olacaktır. Girdi , İlerleme ve Çıktınızın
ne olduğunu anlamanız yeterlidir.

Örneğin: resim açıklamasını buraya girin

AsyncTask'in Kalbi!

doInBackgound()yöntem en önemli yöntemdir AsyncTaskçünkü

  • Yalnızca bu yöntem arka plan iş parçacığında çalışır ve verileri UI iş parçacığında yayınlar.
  • İmzası AsyncTaskparametrelerle değişir .

Şimdi ilişkiyi görelim

resim açıklamasını buraya girin

doInBackground()ve onPostExecute(), onProgressUpdate()aynı zamanda ilgili

resim açıklamasını buraya girin

Bana kodu göster
Peki DownloadTask için kodu nasıl yazacağım?

DownloadTask extends AsyncTask<String,Integer,String>{

      @Override
      public void onPreExecute()
      {}

      @Override
      public String doInbackGround(String... params)
      {
               // Download code
               int downloadPerc = // calculate that
               publish(downloadPerc);

               return "Download Success";
      }

      @Override
      public void onPostExecute(String result)
      {
          super.onPostExecute(result);
      }

      @Override
      public void onProgressUpdate(Integer... params)
      {
             // show in spinner, access UI elements
      }

}

Bu Görevi nasıl yürüteceksin

new DownLoadTask().execute("Paradise.mp3");

1
// show in spinner, access UI elementssadece onProgressUpdate(...):) için en basit açıklamayı
Volkan Güven

5

Aşağıdaki bağlantılara bakın:

  1. http://developer.android.com/reference/android/os/AsyncTask.html
  2. http://labs.makemachine.net/2010/05/android-asynctask-example/

Üçten fazla bağımsız değişken iletemezsiniz, yalnızca 1 bağımsız değişken geçmek istiyorsanız, diğer iki bağımsız değişken için void kullanın.

1. private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> 


2. protected class InitTask extends AsyncTask<Context, Integer, Integer>

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. Eşzamansız görev, Params, Progress ve Result adlı 3 genel tür ve onPreExecute, doInBackground, onProgressUpdate ve onPostExecute adlı 4 adımla tanımlanır.

KPBird


3
  • Kısacası, AsyncTask'ta 3 parametre var

    1. DoInBackground'da Giriş kullanımı için parametreler (String ... params)

    2. OnProgressUpdate'de kullanım durumunu gösterme parametreleri (String ... status)

    3. OnPostExcute içinde sonuç kullanımı için parametreler (String ... sonuç)

    Not: - [Parametrelerin türü ihtiyacınıza göre değişebilir]

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.