2019-04-01 子线程中Handler接收不到消息/han
2019-04-01 本文已影响0人
HaloMartin
在子线程中,使用Handler内部类或继承的Handler类都会存在handleMessage不会接收并处理消息的问题,如下:
Handler handler = new Handler() {
@Override public void handleMessage(Message msg) {
super.handleMessage(msg);
//执行Code
}
}
大致原因是,如果在UI主线程中,如常见的Activity中,主线程默认会自动创建Looper以供消息队列使用,但是在子线程中,如下:
new Thread() {
public void run() {
//new Handler并通过sendMessage或post等,发送消息
}
}.start();
这样的代码,默认是不会在子线程中创建Looper的,需要想办法解决。
解决方法1:
Handler需要绑定到Looper才能正常使用,如果在子线程中,则需要通过
Looper.prepare();
//定义Handler并制定Looper
Handler handler = new Handler(Looper.myLooper());
...
handler.sendMessage(...);
Looper.loop();
并且在不使用时,在线程退出前调用Looper.myLooper().quit()退出Looper,否则会占用内存造成内存泄漏
解决方法2:
把在子线程中,但是使用主线程的Looper,在new时,使用Looper.getMainLooper()把主线程的Looper做为Handler的构造方法参数传入即可,如下:
Handler handler = new Handler(Looper.getMainLooper());