HandlerThread
2021-06-22/2021-06-22
参考文献:Android多线程(HandlerThread篇)
1. 简介
HandlerThread 有那些特点:
- HandlerThread 本质上是一个线程类,它继承了 Thread;
- HandlerThread 有自己的内部 Looper 对象,可以进行 looper 循环;
- 通过获取 HandlerThread 的 looper 对象传递给 Handler 对象,可以在 handleMessage 方法中执行异步任务;
- 创建 HandlerThread 后必须先调用 HandlerThread.start() 方法,Thread 会先调用 run 方法,创建 Looper 对象。
2. 基础使用
-
创建实例对象
1// 传入参数的作用主要是标记当前线程的名字,可以任意字符串。 2HandlerThread handlerThread = new HandlerThread("downloadImage");
-
启动线程
1//必须先开启线程 2handlerThread.start();
-
构建异步 handler
1handler = new Handler(mCheckMsgThread.getLooper()) 2{ 3 @Override 4 public void handleMessage(Message msg) { 5 } 6};
此时,此 handleMessage 是在子线程执行的
3. 例子
1public class MainActivity extends AppCompatActivity {
2
3 private TextView mTvServiceInfo;
4 private HandlerThread mCheckMsgThread;
5 private Handler mCheckMsgHandler;
6 private boolean isUpdateInfo;
7
8 private static final int MSG_UPDATE_INFO = 0x110;
9
10 //与UI线程管理的handler
11 private Handler mHandler = new Handler();
12
13 @Override
14 protected void onCreate(Bundle savedInstanceState)
15 {
16 super.onCreate(savedInstanceState);
17 setContentView(R.layout.activity_main);
18
19 //创建后台线程
20 initBackThread();
21
22 mTvServiceInfo = (TextView) findViewById(R.id.id_textview);
23
24 }
25
26 @Override
27 protected void onResume()
28 {
29 super.onResume();
30 //开始查询
31 isUpdateInfo = true;
32 mCheckMsgHandler.sendEmptyMessage(MSG_UPDATE_INFO);
33 }
34
35 @Override
36 protected void onPause()
37 {
38 super.onPause();
39 //停止查询
40 isUpdateInfo = false;
41 mCheckMsgHandler.removeMessages(MSG_UPDATE_INFO);
42
43 }
44
45 private void initBackThread()
46 {
47 mCheckMsgThread = new HandlerThread("check-message-coming");
48 mCheckMsgThread.start();
49 mCheckMsgHandler = new Handler(mCheckMsgThread.getLooper())
50 {
51 @Override
52 public void handleMessage(Message msg)
53 {
54 checkForUpdate();
55 if (isUpdateInfo)
56 {
57 mCheckMsgHandler.sendEmptyMessageDelayed(MSG_UPDATE_INFO, 1000);
58 }
59 }
60 };
61
62
63 }
64
65 /**
66 * 模拟从服务器解析数据
67 */
68 private void checkForUpdate()
69 {
70 try
71 {
72 //模拟耗时
73 Thread.sleep(1000);
74 mHandler.post(new Runnable()
75 {
76 @Override
77 public void run()
78 {
79 String result = "实时更新中,当前大盘指数:<font color='red'>%d</font>";
80 result = String.format(result, (int) (Math.random() * 3000 + 1000));
81 mTvServiceInfo.setText(Html.fromHtml(result));
82 }
83 });
84
85 } catch (InterruptedException e)
86 {
87 e.printStackTrace();
88 }
89
90 }
91
92 @Override
93 protected void onDestroy()
94 {
95 super.onDestroy();
96 //释放资源
97 mCheckMsgThread.quit();
98 }
99}