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,不然的话还是会抛错误。

  • 相关阅读:
    jsonview插件的常见使用方法整理
    有哪些可以节省chrome内存的扩展插件?
    js得到时间戳(10位数)
    html模板引擎jade的使用
    js获取url参数,操作url参数
    追加window.onload函数
    解决jquery与zepto等其它库冲突兼容的问题
    centos 搭建web平台
    简易web服务器(npm)
    js函数调用与声明 (for时注意)
  • 原文地址:https://www.cnblogs.com/wutianlong/p/5455686.html
Copyright © 2011-2022 走看看