HandlerThread

简介: 一、概念     1、Android中Handler的使用,一般都在UI主线程中执行,因此在Handler接收消息后,处理消息时,不能做一些很耗时的操作,否则将出现ANR错误。    2、HandlerThread继承于Thread,所以它本质就是个Thread。
一、概念

    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     }

 

相关文章
|
Java API 微服务
【Spring Boot系列】通过OpenAPI规范构建微服务服务接口
【4月更文挑战第5天】通过OpenAPI接口构建Spring Boot服务RestAPI接口
533 0
|
9月前
|
存储 SQL 人工智能
DeepSeek开源周第五弹之二!Smallpond:构建于3FS之上的轻量级数据处理框架,高效处理PB级数据
Smallpond 是 DeepSeek 开源的轻量级数据处理框架,基于 DuckDB 和 3FS 构建,支持 PB 级数据处理,提供高性能的数据加载、查询和转换功能,适合大规模数据预处理和实时分析。
815 1
DeepSeek开源周第五弹之二!Smallpond:构建于3FS之上的轻量级数据处理框架,高效处理PB级数据
|
存储 Python
链表中插入节点
链表中插入节点
|
弹性计算 安全 网络安全
阿里云服务器租用流程,四种阿里云服务器租用方式图文教程参考
阿里云服务器可以通过自定义租用、一键租用、云市场租用和活动租用四种方式去租用,不同的租用方式适合不同的用户群体,例如我们只是想租用一款配置较低且可以快速部署应用的云服务器,通常可以选择一键租用或者云市场租用,本文为大家展示不同租用方式的适合对象以及租用流程,以供初次租用阿里云服务器的用户参考和选择。下面是阿里云服务器租用的图文操作步骤。
11942 2
|
API iOS开发 智能硬件
在iOS应用中使用实时活动与灵动岛
iOS16系统引入了实时活动与灵动岛相关的API。实时活动API能够让用户在桌面直接浏览到应用程序所提供的实时性较高的信息,例如比赛的比分信息,外卖的配送进度信息,票务信息等。在支持灵动岛的设备上,实时活动配合灵动岛,更是能带给用户沉浸式的信息获取体验,在某些特定应用场景下非常有用。
1158 8
表格数据填充方法
【10月更文挑战第22天】表格数据填充方法
1161 2
|
数据采集 JavaScript 前端开发
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
|
机器学习/深度学习 计算机视觉 人工智能
用基础模型指导特征传播,首个泛化型图像匹配器OmniGlue搞定未见过域
【6月更文挑战第3天】研究人员提出OmniGlue,首个以泛化为中心的图像匹配器,利用基础模型DINOv2的广泛知识和关键点位置引导的注意力机制,提升未见过图像域的匹配性能。在7个不同图像域的实验中,OmniGlue相对其他模型表现出20.9%的相对增益,优于LightGlue 9.5%。尽管有改进空间,OmniGlue标志着图像匹配技术泛化能力的重要进步。论文链接:https://arxiv.org/pdf/2405.12979
285 2
|
自然语言处理 监控 数据挖掘
信息系统项目管理师重点内容汇总(第十二天)
【1月更文挑战第12天】乘风破浪会有时,直挂云帆济沧海
955 2