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?
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?
Jawaban:
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.
AsyncTasksdieksekusi pada satu utas, jadi tidak ada paralelisme lagi. Anda masih bisa menjalankannya pada Executorimplementasi paralel .
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.
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.
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.
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.
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 .
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.
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.