Android之HandlerThreadb

本文只是记录一些零碎的东西

今天看camera sample时发现一个好东西,HandlerThread,赶紧学习下

HandlerThread可以创建一个带有looper的线程。looper对象可以用于创建Handler类来进行来进行调度。

先看看Handler原理 :

Message 意为消息,发送到Handler进行处理的对象,携带描述信息和任意数据。
MessageQueue 意为消息队列,Message的集合。
Looper 有着一个很难听的中文名字,消息泵,用来从MessageQueue中抽取Message,发送给Handler进行处理。
Handler 处理Looper抽取出来的Message。

HandlerThread继承自Thread,当线程开启时,线程同时创建了一个含有消息队列的Looper,HandlerThread适合在只需要在一个工作线程(非UI线程)+任务的等待队列的形式。用在获取相机数据 里面真的合适不过了

看一个模拟测试

/**
     * HandlerThread继承自Thread,当线程开启时,线程同时创建了一个含有消息队列的Looper,
     * 并对外提供自己这个Looper对象的get方法,这就是它和普通Thread唯一不同的地方。
     * 1.开发中如果多次使用类似new Thread(){...}.start()
     * 任务周期长时,会使得程序运行起来越来越慢
     * 而HandlerThread自带Looper使他可以通过消息来多次重复使用当前线程,节省开支;
     * 2.Handler类默认绑定的是UI线程的消息队列,Looper
     * 对于非UI线程又想使用消息机制,那么HandlerThread内部的Looper是最合适的,它不会干扰或阻塞UI线程。
     *
     */
    private final int TEST_MESSAGE1 = 0x01;
    private final int TEST_MESSAGE2 = 0x02;
    private Handler mHandler;
    private void testHandlerThread(){
        HandlerThread mHandlerThread = new HandlerThread("name");
        mHandlerThread.start();
        mHandler = new Handler(mHandlerThread.getLooper(),callback);
        testQueue();
        //or
//        Handler mHandler = new Handler(mHandlerThread.getLooper());
//        // use when you want to do something
//        mHandler.post(new Runnable() {
//            @Override
//            public void run() {
//                // do something
//            }
//        });


        // quit
//        try {
//            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
//                mHandlerThread.quitSafely();
//            }else {
//                mHandlerThread.quit();
//            }
//            mHandlerThread.join();
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }

    }

    // 模拟
    private void testQueue() {
        Random r = new Random();
        while (true) {
            int temp = r.nextInt(10);
            if( temp == 3){
                mHandler.sendEmptyMessage(TEST_MESSAGE1);
            }else
            if( temp == 6){
                mHandler.sendEmptyMessage(TEST_MESSAGE2);
            }
        }
    }

    Handler.Callback callback = new Handler.Callback() {
        @Override
        public boolean handleMessage(Message message) {

            switch (message.what) {
                case TEST_MESSAGE1:
                    // do something 子线程里
                    Log.i("slack","this is message 1...");
                    break;
                case TEST_MESSAGE2:
                    Log.i("slack","this is message 2...");
                    break;
            }

            return true;// handler message
        }
    };



这么爽,实际项目里时刻准备着使用



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值