Saya mencoba memahami looper dan handler di Android, tetapi terjebak dengan contoh yang ditulis. Apa yang saya coba lakukan adalah, menambahkan looper ke utas, untuk membuat utas berjalan terus menerus dalam metode run() . Kemudian posting pesan atau runnables ke utas handler.
public class HLClass extends Thread {
Handler mHandler;
@Override
public void run() {
super.run();
Looper.prepare();
mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.d("HLClass","In Handler, Msg = "+msg.arg1);
}
};
Looper.loop();
}
}
Inilah cara saya mencoba memanggil handler:
HLClass hlc = new HLClass();
hlc.start();
Message m = hlc.mHandler.obtainMessage();
m.arg1 = 10;
hlc.mHandler.sendMessage(m);
Kesalahan:
Disebabkan oleh: java.lang.NullPointerException: Mencoba memanggil metode virtual 'android.os.Message android.os.Handler.obtainMessage()' pada referensi objek nol
Di sini, apa yang sebenarnya saya coba pahami, bagaimana saya dapat melampirkan penangan ke utas dan kemudian memposting pesan dari utas lain Bagaimana saya bisa dengan aman memposting Pesan atau Runnable ke penangan tanpa kesalahan.
2 jawaban
Anda dapat mencoba kode berikut untuk mengirim pesan.
final HLClass hlc = new HLClass();
hlc.start();
new Handler().postDelayed(new Runnable() {
public void run() {
Message m = hlc.mHandler.obtainMessage();
m.arg1 = 10;
hlc.mHandler.sendMessage(m);
}
}, 300);
Handler adalah komponen yang dapat dilampirkan ke utas dan kemudian dibuat untuk melakukan beberapa tindakan pada utas itu melalui pesan sederhana atau tugas Runnable. Ia bekerja bersama dengan komponen lain, Looper, yang bertanggung jawab atas pemrosesan pesan di utas tertentu.
Saat Handler dibuat, ia bisa mendapatkan objek Looper di konstruktor, yang menunjukkan thread mana yang dilampirkan handler. Jika Anda ingin menggunakan handler yang dilampirkan ke utas utama, Anda perlu menggunakan looper yang terkait dengan utas utama dengan memanggil Looper.getMainLooper().
Dalam hal ini, untuk memperbarui UI dari utas latar belakang, Anda dapat membuat pengendali yang dilampirkan ke utas UI, lalu memposting tindakan sebagai Runnable:
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
// update the ui from here
}
});
Pendekatan ini jauh lebih baik daripada yang pertama, tetapi ada cara yang lebih sederhana untuk melakukan ini ...