Android之HandlerThread学习

本文详细介绍了HandlerThread的基本概念、使用方法及其实现细节。通过具体的代码示例,展示了如何创建HandlerThread,与其相关的Handler,以及如何利用它们进行跨线程的消息传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.HandlerThread介绍

Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note that start() must still be called.
HandlerThread继承自Thread类。在创建一个HandlerThread方法时候,我们可以得到一个这个线程里面带的Looper,这个Looper我们可以在创建Handler时候调用。HandlerThread我们必须使用它的start() 方法来调用这个线程。 一个handler与看个线程相关,我们需要看的是他调用的是那个线程的getLooper()方法。默认是主线程的looper,因为主线程中有了looper,UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,该Looper与UI主线程一一对应。

2.使用方法

  • 2.1创建一个HandlerThread实例
  • 2.2调用实例的start()方法
  • 2.3创建一个与HandlerThread线程相关的handler
  • 2.4使用handler发送消息

3.自己写一个MyThread希望可以实现上面的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
*集成了handlerThread类
*@authorqiwenming
*
*/
class MyThreand extends Thread{
public HandlermHandler;
@Override
public voidrun(){
Looper.prepare();
mHandler= new Handler(){
@Override
public voidhandleMessage(Messagemsg){
System.out.println( "MyThreand----当前线程:" +Thread.currentThread());
}
};
Looper.loop();
}
}

我们调用的时候,得分开调用(不靠谱)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
*创建handler为什么不在这里面调用 myThread.mHandler.sendEmptyMessage(1);
*是因为mHandler可能会抛空指针异常所以我把创建和调用分开。
*@paramv
*/
public voidtoCreateHandler(Viewv){
myThread= new MyThreand();
myThread.start();
}
/**
*执行handler
*@paramv
*/
public voidtoExcuteHandler(Viewv){
myThread.mHandler.sendEmptyMessage(1);
mHandler.sendEmptyMessage(1);
}


4.我们写一个Handler的子类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
*我的handler
*@authorqiwenming
*
*/
class MyHandler extends Handler{
public MyHandler(){
}
public MyHandler(Looperlooper){
super(looper); //调用与线程相关的looper
}
@Override
public voidhandleMessage(Messagemsg){
System.out.println( "MyHandler----当前线程:" +Thread.currentThread());
}
}

调用
1
2
3
4
5
6
7
//创建一个含有looper的线程,县成名叫做handlerThread
HandlerThreadmHThread= new HandlerThread( "handlerThread" );
mHThread.start(); //开始它
//创建一个我们自己复写Handler的实例,并且调用的的是mHThread线程的looper,这个handler和mHThread相关
MyHandlermyHandler= new MyHandler(mHThread.getLooper());
//发送一个消息
myHandler.sendEmptyMessage(1);


5.所有的代码

5.1 布局文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<LinearLayoutxmlns:android= "http://schemas.android.com/apk/res/android"
android:layout_width= "match_parent"
android:layout_height= "match_parent"
android:orientation= "vertical"
tools:context= ".MainActivity" >
<Buttonandroid:layout_width= "match_parent"
android:layout_height= "wrap_content"
android:text= "创建与线程相关的Handler"
android:onClick= "toCreateHandler" ></Button>
<Buttonandroid:layout_width= "match_parent"
android:layout_height= "wrap_content"
android:text= "调用handler"
android:onClick= "toExcuteHandler" ></Button>
<Buttonandroid:layout_width= "match_parent"
android:layout_height= "wrap_content"
android:text= "创建并调用HandlerThread"
android:onClick= "toHandlerThread" ></Button>
</LinearLayout>
5.2 Activity代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package com.example.handlerdemo;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.view.View;
/**
*Handler使用详情
*
*@authorqiwenming
*
*/
public class MainActivity extends Activity{
public HandlermHandler= new Handler(){
public void handleMessage(Messagemsg){
System.out.println( "CurentThread:" +Thread.currentThread());
}
};
public MyThreandmyThread;
@Override
protected void onCreate(BundlesavedInstanceState){
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
*创建handler为什么不在这里面调用 myThread.mHandler.sendEmptyMessage(1);
*是因为mHandler可能会抛空指针异常所以我把创建和调用分开。
*@paramv
*/
public void toCreateHandler(Viewv){
myThread= new MyThreand();
myThread.start();
}
/**
*执行handler
*@paramv
*/
public void toExcuteHandler(Viewv){
myThread.mHandler.sendEmptyMessage( 1 );
mHandler.sendEmptyMessage( 1 );
}
/**
*集成了handlerThread类
*@authorqiwenming
*
*/
class MyThreand extends Thread{
public HandlermHandler;
@Override
public void run(){
Looper.prepare();
mHandler= new Handler(){
@Override
public void handleMessage(Messagemsg){
System.out.println( "MyThreand----当前线程:" +Thread.currentThread());
}
};
Looper.loop();
}
}
//###########################################################################################
/**
*创建和执行HandlerThread
*@paramv
*/
public void toHandlerThread(Viewv){
//创建一个含有looper的线程,县成名叫做handlerThread
HandlerThreadmHThread= new HandlerThread( "handlerThread" );
mHThread.start(); //开始它
//创建一个我们自己复写Handler的实例,并且调用的的是mHThread线程的looper,这个handler和mHThread相关
MyHandlermyHandler= new MyHandler(mHThread.getLooper());
//发送一个消息
myHandler.sendEmptyMessage( 1 );
//创建一个我们定义的handler的实例,没有指定调用的looper,这里调用的就是主线程的handler
MyHandlermyHandler1= new MyHandler();
myHandler1.sendEmptyMessage( 1 );
//创建一个Handler实例,是他与mHThread相关
HandlermHandler= new Handler(mHThread.getLooper()){
@Override
public void handleMessage(Messagemsg){
System.out.println( "Handler----当前线程:" +Thread.currentThread());
}
};
mHandler.sendEmptyMessage( 1 );
}
/**
*我的handler
*@authorqiwenming
*
*/
class MyHandler extends Handler{
public MyHandler(){
}
public MyHandler(Looperlooper){
super (looper); //调用与线程相关的looper
}
@Override
public void handleMessage(Messagemsg){
System.out.println( "MyHandler----当前线程:" +Thread.currentThread());
}
}
}

6.结果



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值