Argumen apa yang diteruskan ke AsyncTask <arg1, arg2, arg3>?


157

Saya tidak mengerti apa yang harus saya masukkan ke sini dan di mana argumen ini berakhir? Apa tepatnya yang harus saya letakkan, dan ke mana tepatnya akan pergi? Apakah saya harus memasukkan semua 3 atau dapatkah saya memasukkan 1,2,20?

Jawaban:


496

Dokumentasi Android Google mengatakan bahwa:

Tugas asinkron didefinisikan oleh 3 tipe generik, yang disebut Params, Progress and Result, dan 4 langkah, disebut onPreExecute, doInBackground, onProgressUpdate dan onPostExecute.

Jenis generik AsyncTask:

Tiga jenis yang digunakan oleh tugas asinkron adalah sebagai berikut:

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.

Tidak semua tipe selalu digunakan oleh tugas yang tidak sinkron. Untuk menandai suatu tipe sebagai tidak digunakan, cukup gunakan tipe Void:

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

Anda selanjutnya dapat merujuk: http://developer.android.com/reference/android/os/AsyncTask.html

Atau Anda Dapat menghapus apa peran AsyncTask dengan merujuk Blog Sankar-Ganesh

Struktur kelas AsyncTask biasanya berjalan seperti:

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

    protected void onPreExecute(){

    }

Metode ini dijalankan sebelum memulai Thread baru. Tidak ada nilai input / output, jadi hanya inisialisasi variabel atau apa pun yang Anda pikir perlu Anda lakukan.

    protected Z doInBackground(X...x){

    }

Metode paling penting di kelas AsyncTask. Anda harus menempatkan di sini semua hal yang ingin Anda lakukan di latar belakang, di utas yang berbeda dari yang utama. Di sini kita memiliki sebagai input nilai array objek dari tipe "X" (Apakah Anda lihat di header? Kami punya "... extends AsyncTask" Ini adalah TYPES dari parameter input) dan mengembalikan objek dari tipe "Z".

   protected void onProgressUpdate(Y y){

   }

Metode ini disebut dengan menggunakan metode publish Progress (y) dan biasanya digunakan ketika Anda ingin menunjukkan kemajuan atau informasi di layar utama, seperti bilah kemajuan yang menunjukkan kemajuan operasi yang Anda lakukan di latar belakang.

  protected void onPostExecute(Z z){

  }

Metode ini dipanggil setelah operasi di latar belakang dilakukan. Sebagai parameter input, Anda akan menerima parameter output dari metode doInBackground.

Bagaimana dengan tipe X, Y dan Z?

Seperti yang dapat Anda simpulkan dari struktur di atas:

 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.

Bagaimana kita menyebut tugas ini dari kelas luar? Hanya dengan dua baris berikut:

MyTask myTask = new MyTask();

myTask.execute(x);

Di mana x adalah parameter input dari tipe X.

Setelah kami menjalankan tugas, kami dapat mengetahui statusnya dari "luar". Menggunakan metode "getStatus ()".

 myTask.getStatus();

dan kami dapat menerima status berikut:

RUNNING - Menunjukkan bahwa tugas sedang berjalan.

PENDING - Menunjukkan bahwa tugas belum dijalankan.

SELESAI - Menunjukkan bahwa onPostExecute (Z) telah selesai.

Petunjuk tentang menggunakan AsyncTask

  1. Jangan memanggil metode onPreExecute, doInBackground, dan onPostExecute secara manual. Ini secara otomatis dilakukan oleh sistem.

  2. Anda tidak dapat memanggil AsyncTask di dalam AsyncTask atau Utas lainnya. Panggilan metode eksekusi harus dilakukan di Utas UI.

  3. Metode onPostExecute dieksekusi di Thread UI (di sini Anda dapat memanggil AsyncTask lain!).

  4. Parameter input tugas dapat berupa array Obyek, dengan cara ini Anda dapat meletakkan objek dan tipe apa pun yang Anda inginkan.


20
Bung penjelasan sempurna
Kalai.G

30
Lebih baik dari Google.
Diolor

25
+1. SO anggota, perhatikan. INI adalah bagaimana Anda menjelaskannya. Meskipun panjang, sangat mudah dimengerti. Kartik terima kasih.
Subby

3
Penjelasan yang bagus, sekarang saya sangat jelas tentang Asyntask. :) Terima kasih Kartik
Reena

2
Itu membereskan banyak hal bagi saya, jawaban yang bagus!
Michael

80

Saya terlambat ke pesta tetapi berpikir ini mungkin membantu seseorang.


7
Visual ini sangat membantu. Saya akan mulai menggunakan lebih banyak visual seperti ini untuk menunjukkan bagaimana Jenis dan variabel terkait diikat bersama ketika aliran kode tidak mudah atau teknik atau pola tidak umum. Saya berharap orang lain akan melakukan lebih dari ini. Terima kasih
Kent Lauridsen

Visual yang bagus, bisakah Anda menambahkan untuk WeakAsyncTask juga?
kAmol

1
@kAmol yakin, saya akan mencoba untuk membuat aliran WeakAsyncTaskjuga
mrid

4
Suatu hari saya akan membingkai ini dan meletakkannya di dinding saya sehingga saya tidak harus terus kembali ke utas ini untuk referensi.
Matt Robertson

14

Tetap sederhana!

Merupakan AsyncTasktugas latar belakang yang berjalan di utas latar belakang. Dibutuhkan Input , melakukan Kemajuan dan memberikan Output .

yaitu AsyncTask<Input,Progress,Output>.

Menurut pendapat saya sumber kebingungan utama datang ketika kita mencoba untuk menghafal parameter dalam AsyncTask.
Kuncinya adalah Jangan menghafal .
Jika Anda dapat memvisualisasikan apa tugas yang benar-benar perlu Anda lakukan, menulis AsyncTaskdengan tanda tangan yang benar adalah sepotong kue.
Cari tahu apa Input , Kemajuan dan Output Anda dan Anda akan baik untuk pergi.

Sebagai contoh: masukkan deskripsi gambar di sini

Heart of the AsyncTask!

doInBackgound()Metode adalah metode yang paling penting dalam suatu AsyncTasksebab

  • Hanya metode ini yang berjalan di utas latar dan mempublikasikan data ke utas UI.
  • Tanda tangannya berubah dengan AsyncTaskparameter.

Jadi mari kita lihat hubungannya

masukkan deskripsi gambar di sini

doInBackground()dan onPostExecute(), onProgressUpdate()juga terkait

masukkan deskripsi gambar di sini

Tunjukkan kodenya
Jadi bagaimana saya akan menulis kode untuk DownloadTask?

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
      }

}

Bagaimana Anda menjalankan tugas ini

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

1
// show in spinner, access UI elementshanya memberikan penjelasan paling mudah untuk onProgressUpdate(...):)
Volkan Güven

5

Lihat tautan berikut:

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

Anda tidak dapat melewati lebih dari tiga argumen, jika Anda ingin hanya 1 argumen maka gunakan void untuk dua argumen lainnya.

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


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

Tugas asinkron ditentukan oleh perhitungan yang berjalan pada utas latar belakang dan yang hasilnya dipublikasikan pada utas UI. Tugas asinkron didefinisikan oleh 3 tipe generik, yang disebut Params, Progress and Result, dan 4 langkah, disebut onPreExecute, doInBackground, onProgressUpdate dan onPostExecute.

KPBird


3
  • Singkatnya, Ada 3 parameter di AsyncTask

    1. parameter untuk penggunaan Input di DoInBackground (String ... params)

    2. parameter untuk menunjukkan status kemajuan digunakan dalam OnProgressUpdate (status String ...)

    3. parameter untuk hasil digunakan di OnPostExcute (hasil String ...)

    Catatan: - [Jenis parameter dapat bervariasi tergantung pada kebutuhan Anda]

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.