zoukankan      html  css  js  c++  java
  • 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,不然的话还是会抛错误。

  • 相关阅读:
    【前缀和】【分类讨论】hdu5163 Taking Bus
    【DFS】bzoj2079 [Poi2010]Guilds
    【贪心】bzoj3850 ZCC Loves Codefires
    【分类讨论】bzoj3856 Monster
    【莫队算法】【权值分块】bzoj2223 [Coci 2009]PATULJCI
    【枚举】bzoj1709 [Usaco2007 Oct]Super Paintball超级弹珠
    【矩阵哈希】【二分答案】【哈希表】bzoj1567 [JSOI2008]Blue Mary的战役地图
    【矩阵哈希】【哈希表】bzoj2351 [BeiJing2011]Matrix
    【哈希表】CODEVS1230 元素查找
    【二分答案】【哈希表】【字符串哈希】bzoj2946 [Poi2000]公共串
  • 原文地址:https://www.cnblogs.com/wutianlong/p/5455686.html
Copyright © 2011-2022 走看看