android中handler的一些总结以及使用(三)之HandleThread的使用

前两篇附带了一些源码讲述了handler的使用过程,相信大家都会觉得handler使用还是很方便的。这里要再介绍一个类:HandleThread类,该类继承自Thread类,与handler结合使用,使在子线程中处理消息更为便利。话不多说,先来介绍一下HandleThread的使用。

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        HandlerThread handleThread = new HandlerThread("thread_1");         // 传入的参数表示新线程命名为“"thread_1"”
        handleThread.start();            // 开启新线程,这一步少不了

        final Handler handler = new Handler(handleThread.getLooper()){   // 将handler与新线程的Looper绑定,不传参数会默认绑定当前线程(这里是主线程)的Looper
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                // 添加自己的代码,处理业务
            }
        };

        handler.sendEmptyMessage(0);        // 在主线程中发送消息

        new Thread(new Runnable() {
            @Override
            public void run() {
                handler.sendEmptyMessage(1);   // 在子线程中发送消息
            }
        }).start();

    }    
 @Override
    protected void onDestroy() {
        super.onDestroy();
        handleThread.quit();    // activity结束时退出looper
    }

上面就是HandleThread的使用,与之前我们讲handler使用对比,区别在我们不需要去调用Looper.prepare()和looper.loop()方法,因为handleThread已经帮我们做了。下面简单展示一下handleThread的源码部分。

public class HandlerThread extends Thread {            // handlerThread 继承自Thread类
    int mPriority;
    int mTid = -1;
    Looper mLooper;
    private @Nullable Handler mHandler;

    public HandlerThread(String name) {
        super(name);
        mPriority = Process.THREAD_PRIORITY_DEFAULT;
    }

 @Override
    public void run() {            // 覆写了Thread类的run方法
        mTid = Process.myTid();
        Looper.prepare();            // 获取一个Looper
        synchronized (this) {
            mLooper = Looper.myLooper();
            notifyAll();
        }
        Process.setThreadPriority(mPriority);
        onLooperPrepared();
        Looper.loop();                // 开启消息循环
        mTid = -1;
    }
上面可以看出,HandleThread类继承自Thread类,覆写了run方法,在此方法中,帮我们创建Looper对象,并且开启loop循环消息队列,所以使用时,start方法一定要记得调用!


 public boolean quit() {                // 退出消息队列循环
        Looper looper = getLooper();
        if (looper != null) {
            looper.quit();                // 调用looper的方法退出
            return true;
        }
        return false;
    }

以上就是handlerThread的一些介绍,总体来说还是比较简单的。

本人是2017年刚出校门,毕业后才开始从事安卓开发,android和java有很多东西没搞清楚,说的不对的地方欢迎大家指正出来,一起学习,共同进步,也欢迎大家与我微信交流(微信号:zhfwwx)。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值