Handler vs AsyncTask

128

Saya bingung kapan seseorang akan memilih AsyncTask daripada Handler. Katakanlah saya memiliki beberapa kode yang ingin saya jalankan setiap n detik yang akan memperbarui UI. Mengapa saya memilih satu dari yang lain?

Steve
sumber
1
Ini semakin rumit dengan AsyncTaskLoaders. Lihat stackoverflow.com/q/7120813/969325 untuk info lebih lanjut.
Warpzit

Jawaban:

75

IMO, AsyncTask ditulis untuk memberikan cara yang nyaman, mudah digunakan untuk mencapai pemrosesan latar belakang di aplikasi Android, tanpa terlalu khawatir tentang detail tingkat rendah (utas, loop pesan, dll.). Ini menyediakan metode panggilan balik yang membantu untuk menjadwalkan tugas dan juga untuk dengan mudah memperbarui UI kapan pun diperlukan.

Namun, penting untuk dicatat bahwa ketika menggunakan AsyncTask, pengembang tunduk pada batasannya, yang dihasilkan karena keputusan desain yang diambil oleh penulis kelas. Misalnya, saya baru-baru ini menemukan bahwa ada batasan jumlah pekerjaan yang dapat dijadwalkan menggunakan AsyncTasks.

Handler lebih transparan dari keduanya dan mungkin memberi Anda lebih banyak kebebasan; jadi jika Anda ingin lebih banyak kontrol pada hal-hal yang akan Anda pilih Handler jika tidak AsynTask akan bekerja dengan baik.

Samuh
sumber
Betul sekali. Saya menggunakan AsyncTasks untuk semua operasi latar belakang dalam proyek saya. Pada titik tertentu saya mulai mencapai batas maksimum pekerjaan itu, jadi tugas saya hanya akan dimulai setelah yang lain selesai. Pada akhirnya saya harus mengubah semua struktur saya untuk berhenti menggunakan asynctasks dan menghindari mencapai batasan itu.
tbraun
5
Dari Honeycomb aktif, AsyncTasksdieksekusi pada satu utas, jadi tidak ada paralelisme lagi. Anda masih bisa menjalankannya pada Executorimplementasi paralel .
MrSnowflake
63

Aturan praktis saya adalah:

  • Jika Anda melakukan sesuatu yang terisolasi terkait dengan UI, misalnya mengunduh data untuk ditampilkan dalam daftar, silakan dan gunakan AsyncTask.

  • Jika Anda melakukan banyak tugas berulang, misalnya mengunduh banyak gambar yang akan ditampilkan ImageViews(seperti mengunduh thumbnail) saat mengunduh, gunakan antrian tugas bersama Handler.

alexanderblom
sumber
Handler berada di API level 1 & ASYNCTASK di API level 3. akankah itu ditinggalkan dengan biaya berapa pun? karena saya berkonsentrasi pada aplikasi porting dari versi yang lebih lama ke 2.2 & 2.3 ..
yokks
10
Tidak akan ditinggalkan dalam waktu dekat. Handler tidak akan pernah ditinggalkan karena UI pada dasarnya dibangun di sekitarnya.
alexanderblom
Bukankah Anda harus menggunakan Loader untuk memuat data untuk UI Anda untuk menyajikan?
nbarraille
19

Selalu berusaha untuk menghindari menggunakan AsyncTask bila memungkinkan terutama karena alasan berikut:

  • AsyncTask tidak dijamin untuk berjalan karena ada basis ThreadPool dan ukuran maks yang ditetapkan oleh sistem dan jika Anda membuat terlalu banyak asynctask, mereka akhirnya akan hancur

  • AsyncTask dapat diakhiri secara otomatis, bahkan ketika berjalan, tergantung pada siklus hidup aktivitas dan Anda tidak memiliki kendali atasnya

  • Metode AsyncTask berjalan pada UI Thread, seperti onPostExecute, dapat dieksekusi ketika Kegiatan yang dimaksud, tidak terlihat lagi, atau mungkin dalam keadaan tata letak yang berbeda, seperti setelah perubahan orientasi.

Sebagai kesimpulan, Anda seharusnya tidak menggunakan metode AsyncTask yang terhubung dengan UIThread, yang merupakan keunggulan utamanya !!! Selain itu Anda hanya harus melakukan pekerjaan yang tidak penting pada doInBackground. Baca utas ini untuk wawasan lebih lanjut tentang masalah ini:

Apakah AsyncTask benar-benar cacat secara konseptual atau apakah saya hanya melewatkan sesuatu?

Untuk menyimpulkan, cobalah untuk memilih menggunakan IntentServices, HandlerThread atau ThreadPoolExecutor daripada AsyncTask ketika salah satu dari masalah yang dikutip di atas menjadi masalah bagi Anda. Tentu itu akan membutuhkan lebih banyak pekerjaan tetapi aplikasi Anda akan lebih aman.

ketik-a1pha
sumber
Ya, saya telah menghabiskan banyak waktu menyesali banyak kegunaan AsyncTasks. Mereka tampak hebat, tapi ... begitu banyak masalah!
SMBiggs
6
Saya minta maaf untuk posting yang sangat kuat terhadap poin Anda, tapi saya tidak bisa membiarkan gaya buruk Anda mempengaruhi noobies ke android. Poin satu. Anda TIDAK harus menjalankan banyak utas. Jika Anda menemukan ini, arsitektur Anda adalah foobar. Poin 2. Bagaimana mungkin .. Oke, ya semua yang ada di android adalah permainan gratis untuk pemulung ... Anda hanya akan melihat perilaku abserd seperti dijelaskan di atas, dalam beberapa kasus yang sangat sulit. Poin 3. Mengelola tugas Anda, tidak harus kasar, adalah keterampilan pemula. Anda membunuhnya saat Anda menelepon pada Jeda, atau Anda melepaskan dan memasang dengan benar.
StarWind0
1
vogella.com/tutorials/AndroidBackgroundProcessing/article.html Ini semua yang Anda butuhkan untuk mempelajari cara melakukan tugas dengan benar tanpa masalah di atas (dengan asumsi Anda tidak melakukan sesuatu seperti memuntahkan beberapa ratus tugas)
StarWind0
16

Jika Anda ingin melakukan perhitungan setiap x detik, Anda mungkin harus menjadwalkan a Runnablepada Handler(dengan postDelayed()) dan itu Runnableharus dimulai pada utas UI saat ini. Jika Anda ingin memulainya di utas lain, gunakan HandlerThread. AsyncTask lebih mudah digunakan untuk kita tetapi tidak lebih baik dari handler.

MrSnowflake
sumber
7

Handler dikaitkan dengan utas utama aplikasi. ia menangani dan menjadwalkan pesan dan runnable yang dikirim dari utas latar belakang ke utas utama aplikasi.

AsyncTask menyediakan metode sederhana untuk menangani utas latar belakang untuk memperbarui UI tanpa memblokirnya dengan operasi yang memakan waktu.

Jawabannya adalah keduanya dapat digunakan untuk memperbarui UI dari utas latar belakang, perbedaannya ada pada skenario eksekusi Anda. Anda dapat mempertimbangkan untuk menggunakan handler jika Anda ingin memposting pesan yang tertunda atau mengirim pesan ke MessageQueue dalam urutan tertentu.

Anda dapat mempertimbangkan menggunakan AsyncTask jika Anda ingin bertukar parameter (dengan demikian memperbarui UI) antara utas utama aplikasi dan utas latar belakang dengan cara yang mudah dan mudah.

secretlm
sumber
3
Anda dapat membuat Handler Anda sendiri yang dikaitkan dengan Thread lain.
Aleksejs Mjaliks
Handler tidak harus terikat pada utas utama (Utas UI). Itu terkait dengan utas di mana ia dipakai dan menangani Message atau Runnable yang sampai ke antrian pesan utas ini. Itu juga dapat mengirim objek Pesan dan Runnable ke antrian pesan utas ini.
azec-pdx
2

AsyncTaskmenganggap Anda akan melakukan sesuatu pada utas UI, setelah beberapa pekerjaan latar belakang selesai. Selain itu, Anda dapat menjalankannya hanya sekali (setelah ini, statusnya adalah FINISHEDdan Anda akan mendapatkan pengecualian yang mencoba menjalankannya sekali lagi). Juga, fleksibilitas penggunaannya tidak banyak. Ya, Anda bisa menggunakan THREAD_POOL_EXECUTORuntuk eksekusi paralel, tetapi upaya itu mungkin tidak layak.

Handlertidak menganggap apa-apa, kecuali menangani Runnables dan Pesan. Juga, ini dapat dijalankan sebanyak yang Anda inginkan . Anda bebas memutuskan ke utas mana yang harus dilampirkan, bagaimana ia berkomunikasi dengan penangan lain, mungkin memproduksinya HandlerThread. Jadi, ini jauh lebih fleksibel dan cocok untuk beberapa pekerjaan yang berulang.

Periksa berbagai jenis Handler contoh di sini .

lomza
sumber
0

Mereka adalah pertanyaan wawancara terbaik yang ditanyakan. AsyncTask - Mereka digunakan untuk membongkar utas UI dan melakukan tugas di latar belakang. Penangan - Dosis Android memiliki cara komunikasi langsung antara UI dan utas latar. Handler harus digunakan untuk mengirim pesan atau dapat dijalankan melalui antrian pesan.

Jadi AsyncTasks digunakan di mana tugas-tugas diperlukan untuk dieksekusi di latar belakang dan Handler digunakan untuk komunikasi antara UI dan Background Thread.

saubhagya das
sumber
0

doInBackground - pada dasarnya bekerja di utas lainnya. onPostExecute - memposting hasil pada utas UI dan secara internal mengirim pesan ke pengendali utas utama. Utas UI utama sudah memiliki looper dan handler yang terkait dengannya.

Jadi pada dasarnya, jika Anda harus melakukan tugas latar belakang, gunakan AsyncTask. Tetapi pada akhirnya, jika sesuatu perlu diperbarui di UI, itu akan menggunakan pengendali utas utama.

Shinoo Goyal
sumber