Handler、Looper、MessageQueue之间的关系
2018-06-21 本文已影响7人
阿怪Sir
- Handler、Looper和MessageQueue的关系
- Handler用来处理事件,和发送事件
- MessageQueue用来存放Handler发送的Message,一个MessageQueue可以包含多个Massage
- Looper用来取事件,交由Handler处理
- 一个线程对应一个Looper
- 一个Looper对应一个MessageQueue,Looper内置一个MessageQueue对象
- 一个Looper可以和多个Handler绑定
- HandlerThread的使用
-
HandlerThread继承自Thread,会创建一个looper做消息循环。
-
在使用结束时应该调用quit()函数结束looper
-
使用示例:
private void initThread() { mHandlerThread = new HandlerThread("HandlerThread"); mHandlerThread.start(); mThreadHandler = new Handler(mHandlerThread.getLooper()) { @Override public void handleMessage(Message msg) { update(); if (isUpdateInfo) mThreadHandler.sendEmptyMessage(MSG_UPDATE_INFO); } }; } private void update() { try { //模拟耗时 Thread.sleep(2000); mMainHandler.post(new Runnable() { @Override public void run() { String result = "每隔2秒更新数据"; result += Math.random(); tvMain.setText(result); } }); } catch (InterruptedException e) { e.printStackTrace(); } }
-
IntentService的实践:
- 众所周知Service是运行在主线程的,而Android sdk 基于HandlerThread实现了一个运行在异步线程的Service——IntentService。
- 源码展示:
@Override public void onCreate() { // TODO: It would be nice to have an option to hold a partial wakelock // during processing, and to have a static startService(Context, Intent) // method that would launch the service & hand off a wakelock. super.onCreate(); HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); thread.start(); mServiceLooper = thread.getLooper(); mServiceHandler = new ServiceHandler(mServiceLooper); }