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. 创建实例对象

    1// 传入参数的作用主要是标记当前线程的名字,可以任意字符串。
    2HandlerThread handlerThread = new HandlerThread("downloadImage");
    
  2. 启动线程

    1//必须先开启线程
    2handlerThread.start();
    
  3. 构建异步 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}
评论
发表评论
       
       
取消