Looper Handler示例

时间:2017-12-21 18:48:47

标签: android

我试图理解android中的looper和handler,但是却坚持使用编写的示例。 我想要做的是,在线程中添加一个looper,以便在run()方法中连续运行线程。然后将消息或runnable发布到hanlder线程。

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();
        }
    }

这就是我试图调用处理程序的方式:

HLClass hlc = new HLClass();
          hlc.start();
          Message m = hlc.mHandler.obtainMessage();
          m.arg1 = 10;
          hlc.mHandler.sendMessage(m);

错误:

引起:java.lang.NullPointerException:尝试调用虚方法' android.os.Message android.os.Handler.obtainMessage()'在空对象引用上

在这里,我真正想要了解的是,我如何将处理程序附加到线程然后从任何其他线程发布消息 如何安全地将Message或Runnable发布到处理程序而不会出错。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用以下代码发送消息。

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 :(得分:0)

Handler是一个可以附加到线程然后通过简单消息或Runnable任务在该线程上执行某些操作的组件。它与另一个组件Looper一起工作,Looper负责特定线程中的消息处理。

创建Handler时,它可以在构造函数中获取Looper对象,该对象指示处理程序附加到哪个线程。如果要使用附加到主线程的处理程序,则需要通过调用Looper.getMainLooper()来使用与主线程关联的looper。

在这种情况下,要从后台线程更新UI,您可以创建附加到UI线程的处理程序,然后将操作发布为Runnable:

Handler handler = new Handler(Looper.getMainLooper());
    handler.post(new Runnable() {
        @Override
        public void run() {
            // update the ui from here                
        }
    });

这种方法比第一种方法好很多,但有一种更简单的方法可以做到这一点......