Saya baru mengenal Android. Saya ingin tahu apa yang dilakukan Looper
kelas dan juga bagaimana menggunakannya. Saya telah membaca dokumentasi kelas Android Looper tetapi saya tidak dapat sepenuhnya memahaminya. Saya telah melihatnya di banyak tempat tetapi tidak dapat memahami tujuannya. Adakah yang bisa membantu saya dengan mendefinisikan tujuan Looper
dan juga dengan memberikan contoh sederhana jika memungkinkan?
android
multithreading
android-looper
Khawar Raza
sumber
sumber
Jawaban:
Apa itu Looper?
Looper adalah kelas yang digunakan untuk mengeksekusi Pesan (Runnables) dalam antrian. Utas normal tidak memiliki antrian seperti itu, mis. Utas sederhana tidak memiliki antrian apa pun. Ini dijalankan sekali dan setelah eksekusi metode selesai, utas tidak akan menjalankan Pesan lain (Dapat dijalankan).
Di mana kita bisa menggunakan kelas Looper?
Jika seseorang ingin menjalankan beberapa pesan (Runnables) maka ia harus menggunakan kelas Looper yang bertanggung jawab untuk membuat antrian di utas. Misalnya, saat menulis aplikasi yang mengunduh file dari internet, kita dapat menggunakan kelas Looper untuk meletakkan file yang akan diunduh dalam antrian.
Bagaimana itu bekerja?
Ada
prepare()
metode untuk mempersiapkan Looper. Kemudian Anda dapat menggunakanloop()
metode untuk membuat loop pesan di utas saat ini dan sekarang Looper Anda siap untuk mengeksekusi permintaan dalam antrian sampai Anda keluar dari loop.Berikut adalah kode yang dengannya Anda dapat mempersiapkan Looper.
sumber
Anda dapat lebih memahami apa itu Looper dalam konteks kerangka GUI. Looper dibuat untuk melakukan 2 hal.
1) Looper mengubah utas normal , yang berakhir ketika metode run () kembali, menjadi sesuatu yang berjalan terus menerus hingga aplikasi Android berjalan , yang diperlukan dalam kerangka GUI (Secara teknis, itu masih berakhir ketika metode run () kembali. jelaskan apa yang saya maksud di bawah).
2) Looper menyediakan antrian di mana pekerjaan yang harus dilakukan enqueued, yang juga diperlukan dalam kerangka GUI.
Seperti yang Anda ketahui, ketika aplikasi diluncurkan, sistem membuat utas eksekusi untuk aplikasi, yang disebut "utama", dan aplikasi Android biasanya berjalan seluruhnya pada satu utas secara default "utas utama". Tetapi utas utama bukanlah beberapa utas rahasia, khusus . Itu hanya utas normal yang mirip dengan utas yang Anda buat dengan
new Thread()
kode, yang berarti ia berhenti ketika metode run () kembali! Pikirkan contoh di bawah ini.Sekarang, mari kita terapkan prinsip sederhana ini ke aplikasi Android. Apa yang akan terjadi jika aplikasi Android berjalan di utas normal? Utas yang disebut "utama" atau "UI" atau apa pun yang memulai aplikasi Anda, dan menggambar semua UI. Jadi, layar pertama ditampilkan kepada pengguna. Jadi bagaimana sekarang? Utas utama berakhir? Tidak, seharusnya tidak. Itu harus menunggu sampai pengguna melakukan sesuatu, bukan? Tetapi bagaimana kita bisa mencapai perilaku ini? Ya, kita bisa coba dengan
Object.wait()
atauThread.sleep()
. Misalnya, utas utama menyelesaikan pekerjaan awalnya untuk menampilkan layar pertama, dan tidur. Bangun, yang berarti terganggu, ketika pekerjaan baru dilakukan diambil. Sejauh ini bagus, tetapi saat ini kita membutuhkan struktur data seperti antrian untuk menampung banyak pekerjaan. Pikirkan suatu kasus ketika pengguna menyentuh layar secara seri, dan tugas membutuhkan waktu lebih lama untuk diselesaikan. Jadi, kita perlu memiliki struktur data untuk menahan pekerjaan yang harus dilakukan dengan cara masuk pertama keluar pertama. Juga, Anda mungkin membayangkan, mengimplementasikan utas yang selalu berjalan dan proses-kerja-saat-tiba menggunakan interupsi tidak mudah, dan mengarah pada kode yang kompleks dan sering kali tidak dapat dipertahankan. Kami lebih suka membuat mekanisme baru untuk tujuan tersebut, dan itulah yang menjadi tujuan Looper . The dokumen resmi kelas Loopermengatakan, "Utas secara default tidak memiliki loop pesan yang dikaitkan dengan mereka", dan Looper adalah kelas "yang digunakan untuk menjalankan loop pesan untuk utas". Sekarang Anda bisa mengerti artinya.Agar lebih jelas, mari kita periksa kode di mana utas utama diubah. Itu semua terjadi di kelas ActivityThread . Dalam metode main (), Anda dapat menemukan kode di bawah ini, yang mengubah utas utama normal menjadi sesuatu yang kita butuhkan.
dan
Looper.loop()
metode loop tanpa batas dan membagikan pesan dan memproses satu per satu:Jadi, pada dasarnya Looper adalah kelas yang dibuat untuk mengatasi masalah yang terjadi dalam kerangka GUI. Tetapi kebutuhan semacam ini juga dapat terjadi dalam situasi lain juga. Sebenarnya ini adalah pola yang cukup terkenal untuk aplikasi multi-threads, dan Anda dapat mempelajari lebih lanjut tentang itu di " Concurrent Programming in Java " oleh Doug Lea (Terutama, bab 4.1.4 "Worker Threads" akan sangat membantu). Anda juga dapat membayangkan mekanisme semacam ini tidak unik dalam kerangka Android, tetapi semua kerangka kerja GUI mungkin perlu sedikit mirip dengan ini. Anda dapat menemukan mekanisme yang hampir sama dalam kerangka Java Swing.
sumber
Looper memungkinkan tugas dieksekusi secara berurutan pada satu utas. Dan pawang mendefinisikan tugas-tugas yang perlu kita jalankan. Ini adalah skenario khas yang saya coba ilustrasikan dalam contoh ini:
Sekarang kita bisa menggunakan handler di beberapa utas lainnya (misalkan ui utas) untuk mengirim tugas pada Looper untuk dieksekusi.
Di utas UI kami memiliki Looper implisit yang memungkinkan kami menangani pesan di utas ui.
sumber
Android
Looper
adalah pembungkus untuk melampirkanMessageQueue
keThread
dan mengelola pengolahan Queue. Itu terlihat sangat samar dalam dokumentasi Android dan sering kali kita mungkin menghadapiLooper
masalah akses UI terkait. Jika kita tidak memahami dasar-dasarnya, itu menjadi sangat sulit untuk ditangani.Berikut ini adalah artikel yang menjelaskan
Looper
siklus hidup, cara menggunakannya dan penggunaanLooper
dalamHandler
Looper = Utas + MessageQueue
sumber
Definisi Looper & Handler:
Looper adalah kelas yang mengubah utas menjadi Pipeline Thread dan Handler memberi Anda mekanisme untuk mendorong tugas ke dalamnya dari utas lainnya.
Detail:
Jadi Thread PipeLine adalah utas yang dapat menerima lebih banyak tugas dari utas lainnya melalui Handler.
The Looper diberi nama demikian karena mengimplementasikan loop - mengambil tugas berikutnya, mengeksekusinya, kemudian mengambil yang berikutnya dan seterusnya. Handler disebut handler karena digunakan untuk menangani atau menerima tugas berikutnya setiap kali dari utas lainnya dan meneruskan ke Looper (Utas atau Utas Pipa Pipa).
Contoh:
Contoh Looper dan Handler atau PipeLine Thread yang sangat sempurna adalah mengunduh lebih dari satu gambar atau mengunggahnya ke server (Http) satu per satu di utas tunggal alih-alih memulai Utas baru untuk setiap panggilan jaringan di latar belakang.
Baca lebih lanjut di sini tentang Looper dan Handler dan definisi dari Pipeline Thread:
Android Guts: Intro to Loopers and Handler
sumber
Sebuah Looper memiliki
synchronized
MessageQueue
yang digunakan untuk proses Pesan ditempatkan pada antrian.Ini mengimplementasikan
Thread
Pola Penyimpanan Khusus.Hanya satu
Looper
perThread
. Metode utama meliputiprepare()
,loop()
danquit()
.prepare()
menginisialisasi arusThread
sebagaiLooper
.prepare()
adalahstatic
metode yang menggunakanThreadLocal
kelas seperti yang ditunjukkan di bawah ini.prepare()
harus dipanggil secara eksplisit sebelum menjalankan loop acara.loop()
menjalankan loop acara yang menunggu Pesan tiba di pesan Thread tertentu. Setelah Pesan berikutnya diterima,loop()
metode ini mengirimkan Pesan ke penangan targetnyaquit()
mematikan loop acara. Itu tidak mengakhiri loop, tetapi sebaliknya enqueues pesan khususLooper
dapat diprogram dalamThread
beberapa langkahMemperpanjang
Thread
Panggil
Looper.prepare()
untuk menginisialisasi Utas sebagai aLooper
Buat satu atau lebih
Handler
untuk memproses pesan yang masukLooper.loop()
untuk memproses pesan sampai loop diberitahuquit()
.sumber
Rentang hidup java Thread selesai setelah penyelesaian
run()
metode. Utas yang sama tidak dapat dimulai lagi.Looper mengubah normal
Thread
menjadi loop pesan. Metode utamaLooper
adalah:Ini mindorks Artikel oleh Janishar menjelaskan konsep inti dalam cara yang baik.
Looper
dikaitkan dengan sebuah Thread. Jika Anda membutuhkanLooper
utas UI,Looper.getMainLooper()
akan mengembalikan utas terkait.Anda harus
Looper
dikaitkan dengan Handler .Looper
,,Handler
danHandlerThread
merupakan cara Android untuk memecahkan masalah pemrograman asinkron.Setelah melakukannya
Handler
, Anda dapat menghubungi API di bawah ini.HandlerThread adalah kelas praktis untuk memulai utas baru yang memiliki looper. Looper kemudian dapat digunakan untuk membuat kelas handler
Dalam beberapa skenario, Anda tidak dapat menjalankan
Runnable
tugas di UI Thread. mis. Operasi jaringan: Kirim pesan pada soket, buka URL dan dapatkan konten dengan membacaInputStream
Dalam hal ini,
HandlerThread
berguna. Anda bisa mendapatkanLooper
objek dariHandlerThread
dan membuatHandler
onHandlerThread
sebagai ganti utas utama.The HandlerThread kode akan menjadi seperti ini:
Lihat posting di bawah ini sebagai contoh kode:
Android: Bersulang di utas
sumber
Memahami Thread Looper
A java Thread unit eksekusi yang dirancang untuk melakukan tugas dalam metode run () & berakhir setelah itu:
Tetapi di Android ada banyak kasus penggunaan di mana kita perlu menjaga agar Thread tetap hidup dan menunggu input / peristiwa pengguna misalnya. Utas UI alias
Main Thread
.Utas utama di Android adalah utas Java yang pertama kali dimulai oleh JVM pada saat peluncuran aplikasi dan terus berjalan hingga pengguna memilih untuk menutupnya atau menemukan pengecualian yang tidak ditangani.
Sekarang yang perlu diperhatikan di sini adalah meskipun utas utama adalah utas Java namun tetap mendengarkan acara pengguna dan menggambar 60 fps bingkai di layar dan tetap tidak akan mati setelah setiap siklus. bagaimana bisa begitu?
Utas secara default tidak memiliki loop pesan yang terkait dengannya tetapi Anda dapat menetapkannya dengan memanggil Looper.prepare () dalam metode jalankan dan kemudian memanggil Looper.loop ().
Jika Anda ingin menggali lebih dalam bagaimana Looper mengelola
Message
antrian objek maka Anda dapat melihat pada kode sumberLooperclass
:Di bawah ini adalah contoh bagaimana Anda dapat membuat
Looper Thread
dan berkomunikasi denganActivity
kelas menggunakanLocalBroadcast
Penggunaan :
Bisakah kita menggunakan tugas Async atau Layanan Intent saja?
Tugas Async dirancang untuk melakukan operasi singkat di latar belakang dan memberikan kemajuan & hasil pada utas UI. Tugas Async memiliki batas seperti Anda tidak dapat membuat lebih dari 128 tugas Async dan
ThreadPoolExecutor
hanya mengizinkan hingga 5 tugas Async .IntentServices
juga dirancang untuk melakukan tugas latar belakang untuk durasi yang sedikit lebih lama dan Anda dapat menggunakannyaLocalBroadcast
untuk berkomunikasiActivity
. Tetapi layanan hancur setelah eksekusi tugas. Jika Anda ingin tetap berjalan untuk waktu yang lama daripada yang Anda perlu lakukan sihwhile(true){...}
.Kasus penggunaan bermakna lainnya untuk Looper Thread:
Digunakan untuk komunikasi soket 2 arah di mana server terus mendengarkan soket Klien dan menulis kembali pengakuan
Pemrosesan bitmap di latar belakang. Lewati url gambar ke thread Looper dan itu akan menerapkan efek filter dan menyimpannya di lokasi tempe rory dan kemudian menyiarkan jalur temp gambar.
sumber
Jawaban ini tidak ada hubungannya dengan pertanyaan, tetapi penggunaan looper dan cara orang menciptakan handler dan looper dalam SEMUA jawaban di sini adalah praktik buruk yang sebenarnya (beberapa penjelasan benar), saya harus memposting ini:
dan untuk implementasi penuh
sumber
Menangani beberapa item ke bawah atau mengunggah dalam Layanan adalah contoh yang lebih baik.
Handler
danAsnycTask
sering digunakan untuk menyebarkan Acara / Pesan antara UI (utas) dan utas pekerja atau untuk menunda tindakan. Jadi mereka lebih terkait dengan UI.A
Looper
menangani tugas ( Runnables, Futures ) dalam antrian terkait thread di latar belakang - bahkan tanpa interaksi pengguna atau UI yang ditampilkan (aplikasi mengunduh file di latar belakang selama panggilan).sumber
DARI DOK
Looper
Looper
Kelas yang digunakan untuk menjalankan loop pesan untuk athread
. Utas secara default tidak memiliki loop pesan yang terkait dengannya; untuk membuat satu, panggilprepare()
utas yang akan menjalankan loop, dan kemudianloop()
untuk memproses pesan sampai loop dihentikan.Looper
adalah loop penanganan pesan:MessageQueue
, yang berisi daftar pesan. Karakter penting dari Looper adalah bahwa ia terkait dengan utas tempat Looper dibuat.Looper
bernama jadi karena mengimplementasikan loop - mengambil tugas berikutnya, mengeksekusinya, kemudian mengambil yang berikutnya dan seterusnya. IniHandler
disebut pawang karena seseorang tidak dapat menemukan nama yang lebih baikLooper
adalah kelas Java dalam antarmuka pengguna Android yang bersama-sama dengan kelas Handler untuk memproses acara UI seperti klik tombol, redraws layar dan sakelar orientasi.Sebuah utas mendapat
Looper
danMessageQueue
dengan meneleponLooper.prepare()
setelah dijalankan.Looper.prepare()
mengidentifikasi utas panggilan, membuat Looper danMessageQueue
objek dan mengaitkan utasKODE SAMPEL
Untuk informasi lebih lanjut, periksa pos di bawah ini
sumber