zoukankan      html  css  js  c++  java
  • HandlerThread

    一、概念

        1、Android中Handler的使用,一般都在UI主线程中执行,因此在Handler接收消息后,处理消息时,不能做一些很耗时的操作,否则将出现ANR错误。

       2、HandlerThread继承于Thread,所以它本质就是个Thread。(本身是一个线程

       3、与普通Thread的差别就在于,主要的作用是建立了一个线程,并且创立了消息队列,有自己的looper,可以让我们在自己的线程中分发和处理消息。


    二、注意

        1、Handler的处理过程运行在创建Handler的线程里

        2、一个线程对应一个Looper,一个Looper对应一个MessageQueue,一个Looper可以对应多个Handler。

        3、handler应该由处理消息的线程创建。

        4、handler与创建它的线程相关联,而且也只与创建它的线程相关联。handler运行在创建它的线程中,所以,如果在handler中进行耗时的操作,会阻塞创建它的线程。

         5、Looper.myLooper();        //获得当前的Looper

            Looper.getMainLooper()   //获得UI线程的Lopper

         6、Handle的初始化函数(构造函数),如果没有参数,那么他就默认使用的是当前的Looper,如果有Looper参数,就是用对应的线程的Looper。

         7、如果一个线程中调用Looper.prepare(),那么系统就会自动的为该线程建立一个消息队列,然后调用Looper.loop();之后就进入了消息循环,这个之后就可以发消息、取消息、和处理消息。

    三、什么是HandlerThread

            Android的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper。事实上Android提供了一个封装好的带有looper的线程类,即为HandlerThread

    四、实例1

     1 package app.com.myapplication;
     2 
     3 import android.app.Activity;
     4 import android.os.Bundle;
     5 import android.os.Handler;
     6 import android.os.HandlerThread;
     7 import android.os.Looper;
     8 import android.os.Message;
     9 import android.widget.Toast;
    10 
    11 /**
    12  *  Created by ${zyj} on 2016/2/15.
    13  *
    14  */
    15 public class HandlerThreadActivity extends Activity {
    16 
    17     private HandlerThread handlerThread ;
    18     private Handler handler;
    19 
    20     @Override
    21     protected void onCreate(Bundle savedInstanceState) {
    22         super.onCreate(savedInstanceState);
    23 
    24         // 1:创建一个HandlerThread,即创建了一个包含Looper的线程。
    25         handlerThread = new HandlerThread("leochin.com");
    26         handlerThread.start(); //创建HandlerThread后一定要记得start()
    27 
    28         //2:获取HandlerThread的Looper
    29         Looper looper = handlerThread.getLooper();
    30 
    31         //3:创建Handler,通过Looper初始化
    32         handler = new Handler(looper) {
    33 
    34             @Override
    35             public void handleMessage(Message msg) {
    36                 super.handleMessage(msg);
    37                 int what = msg.what;
    38                 Toast.makeText(HandlerThreadActivity.this, "hahah" + what , Toast.LENGTH_SHORT).show();
    39             }
    40         };
    41 
    42         //通过以上三步我们就成功创建HandlerThread。通过handler发送消息,就会在子线程中执行。
    43         //如果想让HandlerThread退出,则需要调用handlerThread.quit();。
    44         
    45         //创建一个线程发送消息
    46         new ChildThread().start();
    47     }
    48 
    49     class ChildThread extends Thread {
    50         @Override
    51         public void run() {
    52             super.run();
    53             try {
    54                 //在子线程中可以做一些耗时的工作
    55                 sleep( 1000 );
    56                 Message message = handler.obtainMessage();
    57                 message.what = 3 ;
    58                 handler.sendMessage(message);
    59             }catch ( Exception e ){
    60 
    61             }
    62         }
    63     }
    64 }

    实例2

     1 package app.com.myapplication;
     2 
     3 import android.app.Activity;
     4 import android.os.Bundle;
     5 import android.os.Handler;
     6 import android.os.HandlerThread;
     7 import android.os.Looper;
     8 import android.os.Message;
     9 import android.widget.Toast;
    10 
    11 /**
    12  *  Created by ${zyj} on 2016/2/15.
    13  *  HandlerThread继承于Thread,所以它本质就是个Thread。
    14  *  与普通Thread的差别就在于,主要的作用是建立了一个线程,并且创立了消息队列,有来自己的looper,可以让我们在自己的线程中分发和处理消息。
    15  */
    16 public class HandlerThreadActivity2 extends Activity {
    17 
    18 
    19     private MHandlerThread  mHandlerThread ;
    20     private Handler handler ;
    21 
    22     @Override
    23     protected void onCreate(Bundle savedInstanceState) {
    24         super.onCreate(savedInstanceState);
    25 
    26         // 1:创建一个HandlerThread,即创建了一个包含Looper的线程。
    27         mHandlerThread = new MHandlerThread( "thisName" ) ;
    28         mHandlerThread.start(); //创建HandlerThread后一定要记得start()
    29 
    30         //2:获取HandlerThread的Looper
    31         Looper looper = mHandlerThread.getLooper();
    32 
    33         //3:创建Handler,通过Looper初始化
    34         //特别要注意的是handler与谁相关,不是看handler写在什么位置,而是看handler的looper跟什么相关
    35         handler = new Handler(looper) {
    36 
    37             @Override
    38             public void handleMessage(Message msg) {
    39                 super.handleMessage(msg);
    40                 int what = msg.what;
    41                 Toast.makeText(HandlerThreadActivity2.this, "hahah" + what , Toast.LENGTH_SHORT).show();
    42             }
    43         };
    44 
    45         handler.sendEmptyMessage(2) ;
    46 
    47     }
    48 
    49     class  MHandlerThread extends  HandlerThread {
    50         public MHandlerThread(String name) {
    51             super(name);
    52         }
    53     }
    54 }

    注意:写 MHandlerThread 的时候,最好写上线程的优选级

    1  class  MHandlerThread extends  HandlerThread {
    2         public MHandlerThread(String name ) {
    3             //设置程序的优先级(标准后台程序)
    4             super(name , Process.THREAD_PRIORITY_BACKGROUND);
    5         }
    6     }
  • 相关阅读:
    vmware esxi 过期,激活
    mysql 导入csv文件
    定时登录下载sftp服务器上的某些有规则的文件
    修改tmp的临时目录的地址
    jetty权威指南
    将linux下的rm命令改造成mv到指定的目录下
    mysql 5.6 grant授权的时候出现问题
    Keras vs. PyTorch
    Visualizing LSTM Layer with t-sne in Neural Networks
    keras Lambda 层
  • 原文地址:https://www.cnblogs.com/zhaoyanjun/p/5201255.html
Copyright © 2011-2022 走看看