• HandlerThread 用法


         HandlerThread最大的优势在于引入MessageQueue概念,可以进行多任务队列管理。

      HandlerThread背后只有一个线程,所以任务是串行依次执行的。串行相对于并行来说更安全,各任务之间不会存在多线程安全问题。

      HandlerThread所产生的线程会一直存活,Looper会在该线程中持续的检查MessageQueue,并开启消息处理的循环。这一点和Thread(),AsyncTask都不同,thread实例的重用可以避免线程相关的对象的频繁重建和销毁。 getLooper().quit();来退出这个线程,其实原理很简单,就是改变在消息循环里面标志位,退出整个while循环,使线程执行完毕。

         部分 测试代码如下: 

        public void onCreate(Bundle savedInstanceState) {

    Java代码  收藏代码
    1.     super.onCreate(savedInstanceState);  
    2.     setContentView(R.layout.main);  
    3.     tv_name = (TextView) findViewById(R.id.tv_name);  
    4.     btn_name = (Button) findViewById(R.id.btn_name);  
    5.     Log.i(TAG, "==================main thread:" + Thread.currentThread().getName()); 
    6.  
    7.     final HandlerThread mHandlerThread = new HandlerThread("handlerThread");  
    8.     mHandlerThread.start(); 
    9.     // Handler的handlerMessage方法在主线程执行还是在子线程执行,取决于创建Handler时传递给Handler的looper 
    10.     final MyHandler mHanlder = new MyHandler(mHandlerThread.getLooper());  
    11.       
    12.     btn_name.setOnClickListener(new OnClickListener() {  
    13.           
    14.         @Override  
    15.         public void onClick(View v) {  
    16.             mHanlder.sendEmptyMessage(1);  
    17.               
    18.             try {  
    19.                 Thread.sleep(3000);  
    20.             } catch (InterruptedException e) {  
    21.                 e.printStackTrace();  
    22.             }  
    23.             mHandlerThread.getLooper().quit();  
    24.         }  
    25.     });  
    26. }  
    27.   
    28. class MyHandler extends Handler {  
    29.   
    30.     public MyHandler(Looper looper) {  
    31.         super(looper);  
    32.     }  
    33.   
    34.     @Override  
    35.     public void handleMessage(Message msg) {  
    36.         Log.i(TAG, "==================" + Thread.currentThread().getName()); 
    37.          // 输出内容为: ==============handlerThread 
    38.         //tv_name.setText("hello, this is the first message from handler");  
    39.         super.handleMessage(msg);  
    40.     }  
    41. }  

       不过要注意:要想更新界面内容,还是需要使用主线程的Looper,不然的话还是会抛错误。

  • 相关阅读:
    深度学习时代的图模型,清华发文综述图网络
    深入解析CNN pooling 池化层原理及其作用
    如何理解线性回归中的“回归”,回归到哪里?
    线性回归中“回归”的含义
    深度学习基础——Epoch、Iteration、Batchsize
    手动清空微信PC客户端数据
    Mini-batch 和batch的区别
    Python中绘制场景热力图
    HSV颜色识别-HSV基本颜色分量范围
    Android拨打接听电话自动免提
  • 原文地址:https://www.cnblogs.com/wutianlong/p/5455686.html
Copyright © 2020-2023  润新知