Ketika saya membutuhkan sesuatu untuk berjalan secara tidak sinkron , seperti tugas yang berjalan lama atau logika yang menggunakan jaringan, atau untuk alasan apa pun, Memulai Thread baru dan menjalankannya berfungsi dengan baik. Membuat Handler dan menjalankannya juga berfungsi. Apa bedanya? Kapan saya harus menggunakan masing-masing? Apa keuntungan / alasan untuk menggunakan Handler
dan bukan Thread
?
PS. - Demi pertanyaan ini, mari kita abaikan AsyncTask
. - Handler().postDelayed
use case jelas bagi saya, demi pertanyaan ini mari kita asumsikan saya perlu tugas untuk memulai segera.
Jawaban:
Jika apa pun yang Anda lakukan "berat", Anda harus melakukannya di Thread. Jika Anda tidak memulai secara eksplisit di utasnya sendiri, maka ia akan berjalan pada utas utama (UI) yang mungkin terlihat gelisah atau lambat merespons antarmuka oleh pengguna Anda.
Menariknya ketika Anda menggunakan utas, sering juga berguna untuk menggunakan Handler sebagai sarana komunikasi antara utas yang Anda mulai dan utas utama.
Interaksi Thread / Handler yang khas mungkin terlihat seperti ini:
Secara umum, yang perlu dibawa pulang adalah Anda harus menggunakan Thread setiap kali Anda melakukan beberapa pekerjaan yang bisa berjalan lama atau sangat intensif (mis. Jaringan apa pun, file IO, aritmatik berat, dll).
sumber
updateUI()
akan berjalan setelahonCreateView
(setelah tampilan baru dimuat)?message.what()
? Bukankah begituif(msg == 0){
? Terima kasih banyak! :)Handler dan Thread benar-benar 2 hal yang berbeda.
Thread harus dibuat untuk menjalankan pekerjaan yang sudah berjalan lama.
Handler adalah objek yang sangat nyaman untuk berkomunikasi antara 2 utas (misalnya: utas latar perlu memperbarui UI. Anda dapat menggunakan Handler untuk memposting beberapa Runnable dari utas latar Anda ke utas UI).
Jadi Anda tidak punya pilihan antara Handler atau Thread. Gunakan utas untuk melakukan pekerjaan berat! (Anda dapat menggunakan Handler jika utas latar belakang Anda akan memicu beberapa pekerjaan untuk dikerjakan di utas lain - sebagian besar waktu utas UI)
sumber
Handler
danThread
ada dua hal yang berbeda, tetapi mereka tidak saling bertentangan. Anda dapat memilikiHandler
danThread
pada saat yang sama dan sebenarnya masing-masingHandler
harus berjalan dalamThread
.Untuk lebih jelasnya, Anda mungkin ingin membaca artikel ini .
sumber
A
Handler
berjalan di samaThread
, aThread
berjalan di utas berbeda.Gunakan Handler jika Anda perlu menjalankan sesuatu pada utas yang sama , biasanya elemen GUI atau sesuatu seperti itu.
Gunakan Utas jika Anda ingin utas utama bebas melakukan hal-hal lain . Gunakan ini untuk apa pun yang membutuhkan banyak waktu.
sumber
Penangan adalah cara komunikasi terbaik antara latar belakang dan utas UI. Umumnya Handler dikaitkan dengan antrian pesan dari Thread dan mereka digunakan untuk mengirim pesan dan dapat dijalankan ke Pesan.
MENGGUNAKAN:
Utas: Untuk melakukan tugas dalam utas (Latar Belakang) ulir dari utas UI. (membantu untuk membuka blokir utas UI)
Handler Digunakan untuk berkomunikasi antara UI dan utas Latar.
Lihat artikel ini
sumber
... info lebih lanjut di sini tentang utas dll. (termasuk turorial untuk berbagai threading dan mekanisme sinkronisasi serta kapan harus menggunakan apa)
sumber
Sebuah Handler memungkinkan Anda untuk mengirim dan proses Pesan dan
Runnable
benda yang berhubungan dengan thread iniMessageQueue
. SetiapHandler
instance dikaitkan dengan utas tunggal dan antrian pesan utas itu.Saat Anda membuat yang baru
Handler
, ia terikat ke antrian utas / pesan dari utas yang membuatnya - sejak saat itu, ia akan mengirimkan pesan dan runnables ke antrian pesan itu dan menjalankannya saat keluar dari antrian pesan .Ada dua kegunaan utama untuk Handler:
Jika Anda menggunakan utas java, Anda harus menangani sesuatu sendiri - menyinkronkan dengan utas utama, membatalkan utas dll.
Utas tunggal ini tidak membuat kumpulan utas kecuali Anda menggunakan
ThreadPoolExecutor
atauExecutorService
API.(Ambil permintaan ini dari komentar Anda pada jawaban Blackbelt)
Referensi: Artikel Kinerja Utas
Ada beberapa jenis pekerjaan yang dapat direduksi menjadi tugas yang sangat paralel dan terdistribusi. Dengan banyaknya paket kerja yang diciptakan,
AsyncTask
danHandlerThread
ini bukan kelas yang sesuai. Sifat single-threadedAsyncTask
akan mengubah semua pekerjaan threadpool menjadi sistem linier. MenggunakanHandlerThread
kelas, di sisi lain, akan membutuhkan programmer untuk secara manual mengelola load balancing antara sekelompok thread.ThreadPoolExecutor adalah kelas pembantu untuk membuat proses ini lebih mudah. Kelas ini mengelola pembuatan sekelompok utas, menetapkan prioritas mereka, dan mengelola bagaimana pekerjaan didistribusikan di antara utas tersebut. Saat beban kerja bertambah atau berkurang, kelas berputar atau menghancurkan lebih banyak utas untuk menyesuaikan dengan beban kerja.
Anda bisa merujuk ke artikel panduan pengembang ini di create-threadpool untuk detail lebih lanjut.
Lihat posting ini untuk penggunaan
Handler
menjalankan beberapa instance Runnable. Dalam hal ini, semuaRunnable
tugas akan berjalan dalam satu utas.Android: Bersulang di utas
sumber
Handler
dapat digunakan bersamaan denganThread
untuk membuat mekanisme Antri. Anda dapat menggunakanhandler
untuk memposting sesuatu di InternetThread
Looper
sumber