我试图理解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发布到处理程序而不会出错。
答案 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
}
});
这种方法比第一种方法好很多,但有一种更简单的方法可以做到这一点......