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.
public class HelloRunnable implements Runnable {
public void run() {
System.out.println("Hello from a thread!");
}
public static void main(String args[]) {
(new Thread(new HelloRunnable())).start();
}
}
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.
public final class ActivityThread {
...
public static void main(String[] args) {
...
Looper.prepareMainLooper();
Looper.loop();
...
}
}
dan Looper.loop()
metode loop tanpa batas dan membagikan pesan dan memproses satu per satu:
public static void loop() {
...
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}
...
msg.target.dispatchMessage(msg);
...
}
}
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.