美文网首页
2019-04-01 子线程中Handler接收不到消息/han

2019-04-01 子线程中Handler接收不到消息/han

作者: HaloMartin | 来源:发表于2019-04-01 18:04 被阅读0次

在子线程中,使用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());

相关文章

网友评论

      本文标题:2019-04-01 子线程中Handler接收不到消息/han

      本文链接:https://www.haomeiwen.com/subject/drqbbqtx.html