美文网首页
Android 多线程:HandlerThread理解和使用总结

Android 多线程:HandlerThread理解和使用总结

作者: Marker_Sky | 来源:发表于2017-10-19 18:45 被阅读0次
    Android HandlerThread目录.png

    一、Android中的HandlerThread

    1.1 主要作用

    每隔几秒钟更新数据或图片等。

    1.2 原理

    继承了Thread,实际上是一个使用Looper、Handler的线程。

    1. 继承了Thread,在run()方法中通过Looper.prepare()来创建消息队列,Looper.loop()来循环处理消息。
    2. 使用时开启HandlerThread,创建Handler与HandlerThread的Looper绑定,Handler以消息的方式通知HandlerThread来执行一个具体的任务。

    1.3 特点

    HandlerThread内部维护了一个消息队列,避免多次创建和销毁子线程来进行操作。

    二、HandlerThread的使用

    2.1 HandlerThread使用步骤

    (1)创建HandlerThread实例,参数字符串定义新线程的名称。

    HandlerThread mHandlerThread = new HandlerThread("check-message-coming");
    

    (2)启动HandlerThread线程。

    mHandlerThread.start(); 
    

    (3)创建Handler对象,将HandlerThread的Lopper作为参数,这样就完成了Handler对象与HandlerThread的Looper对象的绑定(这里的Handler对象可以看作是绑定在HandlerThread子线程中,所以handlerMessage里的操作是在子线程中运行的)。 重写handleMessage处理耗时操作。

    Handler mCheckMsgHandler = new Handler(mHandlerThread.getLooper()){
         @Override
         public void handleMessage(Message msg){
             // 进行耗时操作
         }
    };
    

    这样我们就可以使用mCheckMsgHandler对象以处理消息的形式来进行耗时操作,完成以后就可以切换到主线程的handler中来更新UI。

    2.2 HandlerThread使用示例

    依据刚才的步骤,来实现一个每秒更新数据的一个功能,这个功能可以用来更新股票、商品价格等。

    1. 创建和启动HandlerThread,handler绑定:新建Activity,在onCreate()中进行使用一个initBackThread()方法创建HandlerThread。等待mCheckMsgHandler 得到消息开始模拟耗时操作完成后切换到UI线程去更新UI,使用主线程的Handler也是一样的。
        private void initBackThread(){
            // 1.创建HandlerThread
            mHandlerThread = new HandlerThread("check-message-coming");
            // 2.启动HandlerThread线程
            mHandlerThread.start();
            // 3.创建Handler对象绑定该线程的Looper
            mCheckMsgHandler = new Handler(mHandlerThread.getLooper()){
                @Override
                public void handleMessage(Message msg){
                    //模拟耗时操作
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    // 主线程更新数据
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            String result = "每隔1秒更新一下数据:"+Math.random();
                            mInfoText.setText(result);
                        }
                    });
    
                    if(isUpdate){ //1s后再次发送消息进行耗时操作
                        mCheckMsgHandler.sendEmptyMessageDelayed(MSG_UPDATE_INFO, 1000);
                    }
                }
            };
        }
    
    1. 绑定按钮使用handler发送消息:一个开始按钮使mCheckMsgHandler发送消息去进行耗时操作,另一个按钮停止发送消息。标记isUpdate设置是否再次发送消息更新。
            mInfoText = (TextView) findViewById(R.id.tv_info_count);
            findViewById(R.id.btn_start).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //开始更新
                    isUpdate = true;
                    mCheckMsgHandler.sendEmptyMessage(MSG_UPDATE_INFO);
                }
            });
    
            findViewById(R.id.btn_stop).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //停止更新
                    isUpdate = false;
                    mCheckMsgHandler.removeMessages(MSG_UPDATE_INFO);
                }
            });
    
    1. 要记得在onPause()onDestroy()中暂停更新和停止mHandlerThread以释放内存。
        @Override
        protected void onPause() {
            super.onPause();
            isUpdate = false;
            mCheckMsgHandler.removeMessages(MSG_UPDATE_INFO);
        }
    
        @Override
        protected void onDestroy(){
            super.onDestroy();
            //释放资源
            mHandlerThread.quit();
        }
    

    相关文章:
    Android多线程:理解和简单使用总结
    Handler vs Timer,究竟该用哪个?

    相关文章

      网友评论

          本文标题:Android 多线程:HandlerThread理解和使用总结

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