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
Amol K 21 Desember 2017, 21:48
Apa yang sedang Anda coba lakukan?
 – 
tyczj
21 Desember 2017, 21:50
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.
 – 
Amol K
21 Desember 2017, 21:56

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);
1
Yuichi Akiyoshi 21 Desember 2017, 23:04
Hai, @Zhao Lin, terima kasih, ini berhasil. Tapi masih belum jelas kenapa kita perlu membuat Handler baru dan post runnable. Karena sebelum menggunakan handler, kode tersebut berjalan di thread id yang sama dengan run() metode Handler baru sedang berjalan. Bisakah Anda membantu untuk memahami.
 – 
Amol K
22 Desember 2017, 19:32
Hai, @Amol K. "hlc.start()" tidak langsung menjalankan "run()". Itu hanya mengirim pesan untuk dijalankan. Fungsi run() akan berjalan di thread lain setelah menerima permintaan. Dalam kode Anda, hanya meminta mulai dan digunakan handler. Jadi dalam jangka waktu, fungsi di bawah start() akan berjalan sebelum run() di thread. Jika Anda mengakses handler dari permintaan lain seperti klik tombol setelah menjalankan fungsi yang berisi start(), itu akan berfungsi tanpa menggunakan handler.
 – 
Yuichi Akiyoshi
22 Desember 2017, 19:48
Bahkan menambahkan sedikit penundaan setelah start() juga berhasil. Terima kasih.
 – 
Amol K
22 Desember 2017, 22:21
1
Ya. itu akan bekerja dengan hanya sedikit penundaan. Jika pertanyaan saya membantu Anda untuk memecahkan, saya harap Anda akan membuat jawaban ini sebagai ditandai. Terima kasih
 – 
Yuichi Akiyoshi
23 Desember 2017, 01:46

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 ...

0
Yuichi Akiyoshi 21 Desember 2017, 22:07
Terima kasih @Zhao Lin. Tapi di sini, apa yang sebenarnya saya coba pahami, bagaimana saya bisa melampirkan handler ke utas dan kemudian memposting pesan dari utas lainnya.
 – 
Amol K
21 Desember 2017, 22:12
Hai, @Amol K, saya mengerti apa yang Anda inginkan sekarang. Kemudian kode Anda hampir selesai. Kesalahannya adalah Anda mengakses mHandler sebelum diinisialisasi.
 – 
Yuichi Akiyoshi
21 Desember 2017, 23:01
Hai, @Amol K, saya telah menambahkan jawaban lain untuk implementasi kode.
 – 
Yuichi Akiyoshi
21 Desember 2017, 23:04