zoukankan      html  css  js  c++  java
  • Android基础-HanderThread详解

    我们知道在Android系统中,我们执行完耗时操作都要另外开启子线程来执行,执行完线程以后线程会自动销毁。想象一下如果我们在项目中经常要执行耗时操作,如果经常要开启线程,接着又销毁线程,这无疑是很消耗性能的?那有什么解决方法呢?

    1. 使用线程池
    2. 使用HandlerThread

    本篇文章主要讲解一下问题

    1. HandlerThread的使用场景以及怎样使用HandlerThread?
    2. HandlerThread源码分析

    HandlerThread的使用场景以及怎样使用HandlerThread

    使用场景

    HandlerThread是Google帮我们封装好的,可以用来执行多个耗时操作,而不需要多次开启线程,里面是采用Handler和Looper实现的。

    怎样使用HandlerThread?

    1.创建HandlerThread的实例对象

    HandlerThread handlerThread = new HandlerThread("myHandlerThread");

    该参数表示线程的名字,可以随便选择。

    2.启动我们创建的HandlerThread线程

    handlerThread.start();

    3.将我们的handlerThread与Handler绑定在一起。 还记得是怎样将Handler与线程对象绑定在一起的吗?其实很简单,就是将线程的looper与Handler绑定在一起,代码如下:

    mThreadHandler = new Handler(mHandlerThread.getLooper()) {
        @Override
        public void handleMessage(Message msg) {
            checkForUpdate();
            if(isUpdate){
                mThreadHandler.sendEmptyMessage(MSG_UPDATE_INFO);
            }
        }
    };

    注意必须按照以上三个步骤来,下面在讲解源码的时候会分析其原因

    完整代码如下

    public class MainActivity extends AppCompatActivity {
        private static final int MSG_UPDATE_INFO = 0x100;
        Handler mMainHandler = new Handler();
        private TextView mTv;
        private Handler mThreadHandler;
        private HandlerThread mHandlerThread;
        private boolean isUpdate = true;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mTv = (TextView) findViewById(R.id.tv);
            initHandlerThread();
        }
    
        private void initHandlerThread() {
            mHandlerThread = new HandlerThread("xujun");
            mHandlerThread.start();
            mThreadHandler = new Handler(mHandlerThread.getLooper()) {
                @Override
                public void handleMessage(Message msg) {
                    checkForUpdate();
                    if (isUpdate) {
                        mThreadHandler.sendEmptyMessage(MSG_UPDATE_INFO);
                    }
                }
            };
        }
    
        /**
         * 模拟从服务器解析数据
         */
        private void checkForUpdate() {
            try {
                //模拟耗时
                Thread.sleep(1200);
                mMainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        String result = "实时更新中,当前股票行情:<font color='red'>%d</font>";
                        result = String.format(result, (int) (Math.random() * 5000 + 1000));
                        mTv.setText(Html.fromHtml(result));
                    }
                });
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        protected void onResume() {
            isUpdate = true;
            super.onResume();
            mThreadHandler.sendEmptyMessage(MSG_UPDATE_INFO);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            isUpdate = false;
            mThreadHandler.removeMessages(MSG_UPDATE_INFO);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            mHandlerThread.quit();
            mMainHandler.removeCallbacksAndMessages(null);
        }
    }

    运行以上测试代码,将可以看到如下效果图(例子不太恰当,主要使用场景是在handleMessage中执行耗时操作)

    HandlerThread的源码分析

    转载自:https://lrh1993.gitbooks.io/android_interview_guide/content/android/basis/HandlerThread.html

    很想高飞,但我不能;不想天空,剩我一人。
  • 相关阅读:
    CSS总结(六)——元素的垂直居中(已知高度/未知高度)
    CSS总结(五)——定位 position
    CSS总结(四)—— CSS选择器优先级
    CSS总结(三)—— 盒子模型(标准/IE下)
    CSS总结(二)—— 浮动 与 清除浮动
    CSS总结(一)—— display三种元素(区别、重点、扩展)
    JavaScript学习笔记(九)—— JS 理解闭包
    严格模式use strict
    let、const和var的区别
    字符串方法
  • 原文地址:https://www.cnblogs.com/lixiansheng/p/11359885.html
Copyright © 2011-2022 走看看