HandlerThread的用法与自定义HandlerThread(1)

界面介绍

主界面
主界面只有2个textview和3个button(默认空间没删),按钮继承的HandlerThread就是HandlerThread的使用,第二个按钮启动下一个Activity,第三个按钮显示为何需要HandlerThread(挺重要的)。
自定义HandlerThread
正如所看到的样子,从start–>looper–>quit依次点击(别乱了,没有错误处理和判断)。

HandlerThread的用法

使用

首先继承了HandlerThread,并实现了 Handler.Callback的借口

 private class MyHandlerThread extends HandlerThread implements Handler.Callback {
        public MyHandlerThread(String name) {
            super(name);
        }
        @Override
        public boolean handleMessage(Message msg) {
            System.out.println("handleMessage CurrentThread=" + Thread.currentThread().getName());
            handlerUi.sendEmptyMessage(i);
            i++;
            return false;
        }
    }

初始化该handlerThread并启动

 handlerThread = new MyHandlerThread("myHandler");
 handlerThread.start();

Ui线程获取能给HandlerThread发消息的Handler

handler = new Handler(handlerThread.getLooper(), handlerThread);

那HandlerThread如何给Ui线程发消息呢?
还是在MyHandlerThread里面

handlerUi.sendEmptyMessage(i);

soga,通信完成。。

为什么要继承HandlerThread呢

就像我们为什么要开启线程呢,肯定有事住线程不能做(主线程不能做的事好多)。
HandlerThread本身就是一个线程,只是这个线程内部有一个looper而这个looper有一个消息队列MessageQue,它通过不断的用looper去检查MessageQue然后取出消息然后处理,UI主线程本身也是这么干的,我们使用HandlerThread的目的就是借鉴这种线程通信模式

handlerThread的作用(易误解)

以前看别人这么写代码的时候就误解过,那时候关于回调(callback)还不是很会用,关于回调,在java里面使用的次数太多了,面向接口编程很重要
如果不看参数很容易以为

handler = new Handler(handlerThread.getLooper(), handlerThread);

里面的第二个参数也需要handlerThread似的,这也是我以前所困惑的地方,其实他们的参数是 Handler(Looper looper, Callback callback),所以许多地方这样写是为了方便,也就是只要是一个实现了Handler.Callback的对象都行。

如何使用HandlerThread

好了,东西都有了,现在我们就可以使用HandlerThread了
点击按钮,继承的HandlerThread然后就可以实现通过UI线程——>子线程——>UI线程发送消息了
仅仅这样吗?
不,我们自己的线程怎么运行呢?
现在可以使用了

class  MyRunnable implements Runnable{
        @Override
        public void run() {
            handlerUi.sendEmptyMessage(i);
            i=i+2;
            handler.postDelayed(MyRunnable.this,1000);
        }
    }
MyRunnable runnable=new MyRunnable();
handler.postDelayed(runnable,500);

通过HandlerThread的参数(Looper)构造的handler就是我们的工具,比如上面的代码,我们只需要

handler.postDelayed(runnable,500);

就把一个后台线程给运行了,该线程具有通过ui线程的handler更新ui的功能,此时我们并没有使用MyHandlerThread实现的Callback,那个callback是用来接受来自ui线程的消息,通过UI线程的

handler.sendEmptyMessage(1);

去调用Callback

下一节讲解HandlerThread
源码在下一节结尾放出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值