1 .在什么场合需要使用HandlerThread
1 ) .耗时且难以在主线程上执行的操作(可以使用其他线程方法而不考虑第二点) )。
2 )需要在后台执行多个耗时的操作)如果不麻烦,也可以使用多个TThread )。
2.HandlerThread的使用步骤
1 )创建HandlerThread对象
2 )执行start方法,启动HandlerThread的Looper循环
3 ) .在主线程中创建Handler对象,并引用HandlerTherad的looper
4 )将各种消息放入Handler对象的处理
5 ) .如果需要,向在步骤3中创建的Handler对象发送消息
6 ) .不再需要HandlerThread时调用quit或quitSafely停止HandlerThread
示例代码如下。 未进行各种错误处理。 仅供参考。
Java
publicclassmainactivityextendsappcompatactivity {
私有处理程序;
私有握手协议;
私有final int msg _ download=1;
私有金融int msg _ download2=2;
@Override
protectedvoidoncreate (边界维护实例state )。
super.oncreate (savedinstancestate;
setcontentview (r.layout.activity _ main;
myhandler thread=new handler thread (test _ thread );
//这一步很重要
myHandlerThread.start (;
handler=new handler (myhandler thread.get looper () )。
@Override
publicvoidhandlemessage (消息msg )。
okhttpclientclient=newokhttpclient (
super.handle消息(msg;
交换机(msg.what ) {
case MSG_DOWNLOAD:
请求请求=new request.builder (
. URL(http://Baidu.com) )
. build (;
try {
响应响应=client.new call (request ).execute );
log.d(download ),response.body ).string );
}catch(ioexceptione ) {
e .打印堆栈跟踪(;
}
布雷克;
case MSG_DOWNLOAD2:
请求请求1=new request.builder (
. URL(http://Bcoder.com) )。
. build (;
try {
响应响应=client.new call (request1).execute );
log.d(download ),response.body ).string );
}catch(ioexceptione ) {
e .打印堆栈跟踪(;
}
布雷克;
}
}
(;
}
publicvoidondownload 1点击{
handler.sendemptymessage (msg _ download;
}
publicvoidondownload 2点击{
handler.sendemptymessage (msg _ download 2;
}
公共语音查询(viewv ) {
myHandlerThread.quit (;
}
}
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
publicclassmainactivityextendsappcompatactivity {
privateHandlerhandler;
私有握手协议;
私有inalintmsg _ download=1;
私有inalintmsg _ download2=2;
@Override
protectedvoidoncreate (边界维护实例state )。
super.oncreate (savedinstancestate;
setcontentview (r.layout.activity _ main;
myhandler thread=new handler thread (test _ thread );
//这一步很重要
myHandlerThread.start (;
handler=new handler (myhandler thread.get looper () )。
@Override
publicvoidhandlemessage (消息msg )。
okhttpclientclient=newokhttpclient (;
super.handle消息(msg;
交换机(msg.what ) {
caseMSG_DOWNLOAD:
请求请求=new request.builder (
. URL(http://Baidu.com) )
. build (;
try{
响应响应=client.new call (request ).execute );
log.d(download ),response.body ).string );
}catch(ioexceptione ) {
e .打印堆栈跟踪(;
}
布雷克;
caseMSG_DOWNLOAD2:
请求请求1=new request.builder (
. URL(http://Bcoder.com) )。
. build (;
try{
响应响应=client.new call (request1).execute );
log.d(download ),response.body ).string );
}catch(ioexceptione ) {
e .打印堆栈跟踪(;
}
布雷克;
}
}
(;
}
publicvoidondownload 1点击{
handler.sendemptymessage (msg _ download;
}
publicvoidondownload 2点击{
handler.sendemptymessage (msg _ download 2;
}
公共语音查询(viewv ) {
myHandlerThread.quit (;
}
}
如果在测试过程中多次单击Download1和Download2按钮,handler对象将按单击顺序多次下载网页baid.com和bcoder.com
要不要像Thread那样写HandlerThread的子类?
真正程序的执行部分在handler的消息处理中,所以完全不需要
4.QQ和QQ安全有什么区别?
5 .处理程序树的其他特征
1 ).HandlerThread的多个操作按任务1 (任务2 )任务3 )、和串行顺序执行,因此如果希望尽快得到执行结果,建议不要使用HandlerThread这样的方式
6 .下载测试代码
奖赏
微信扫一扫,奖励作者吧~