在子线程中new一个Handler

handler的作用是线程间通信
那么在子线程中new一个handler就是要有其他线程想要和他通信

如果直接new

Thread thread=new Thread(){
            @Override
            public void run() {
                super.run();

                handler=new Handler(){
                    @Override
                    public void handleMessage(Message msg) {
                        super.handleMessage(msg);
                        Log.i(TAG, "handleMessage: "+msg.toString());
                    }

                    @Override
                    public void dispatchMessage(Message msg) {
                        super.dispatchMessage(msg);
                        Log.i(TAG, "dispatchMessage: "+msg.toString());
                    }
                };


            }
        };
              thread.start();

报错如下

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

也就是没有looper
所以要加上Looper.prepare(); Looper.loop();

thread= new Thread(){
            @Override
            public void run() {
                super.run();
                Looper.prepare();

                handler=new Handler(){
                    @Override
                    public void handleMessage(Message msg) {
                        super.handleMessage(msg);
                        Log.i(TAG, "handleMessage: "+msg.toString());
                    }

                    @Override
                    public void dispatchMessage(Message msg) {
                        super.dispatchMessage(msg);
                        Log.i(TAG, "dispatchMessage: "+msg.toString());
                    }
                };
                Looper.loop();


            }
        };
              thread.start();

        //Looper.
    }

这样主线程,其他线程才能和他通信

既然有启动looper,必然有退出looper
那么怎么停止我这个线程中的looper呢
调用quit();
注意api版本quitSafely低版本没有

  handler.getLooper().quit();
   handler.getLooper().quitSafely()

quit和quitSafely区别
当我们调用Looper的quit方法时,实际上执行了MessageQueue中的removeAllMessagesLocked方法,该方法的作用是把MessageQueue消息池中所有的消息全部清空,无论是延迟消息(延迟消息是指通过sendMessageDelayed或通过postDelayed等方法发送的需要延迟执行的消息)还是非延迟消息。

当我们调用Looper的quitSafely方法时,实际上执行了MessageQueue中的removeAllFutureMessagesLocked方法,通过名字就可以看出,该方法只会清空MessageQueue消息池中所有的延迟消息,并将消息池中所有的非延迟消息派发出去让Handler去处理,quitSafely相比于quit方法安全之处在于清空消息之前会派发所有的非延迟消息。

无论是调用了quit方法还是quitSafely方法只会,Looper就不再接收新的消息。即在调用了Looper的quit或quitSafely方法之后,消息循环就终结了,这时候再通过Handler调用sendMessage或post等方法发送消息时均返回false,表示消息没有成功放入消息队列MessageQueue中,因为消息队列已经退出了。

需要注意的是Looper的quit方法从API Level 1就存在了,但是Looper的quitSafely方法从API Level 18才添加进来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值