@TOC
From: https://www.tothenew.com/blog/handler-in-android/
android.os.Handler允许我们发送和处理与线程的消息队列(MessageQueue)关联的消息(Message)和Runnable对象。每个Handler实例都与一个线程和该线程的消息(Message)队列关联。
Handler用于:
- 创建消息(Message)
- 将消息插入队列 (queue)
- 在使用者线程上处理消息
- 管理队列中的消息
Handler的构造
通过使用当前线程的Looper(循环处理器)
new Handler();
new Handler(Handler.Callback)
通过使用显式Looper
new Handler(Looper);
new Handler(Looper, Handler.Callback);
消息创建
有一系列用于创建消息的方法
Message obtainMessage(int what, int arg1, int arg2)
Message obtainMessage()
Message obtainMessage(int what, int arg1, int arg2, Object obj)
Message obtainMessage(int what)
Message obtainMessage(int what, Object obj)
将消息插入队列
将任务添加到消息队列
boolean post(Runnable r)
boolean postAtFrontOfQueue(Runnable r)
boolean postAtTime(Runnable r, Object token, long uptimeMillis)
boolean postAtTime(Runnable r, long uptimeMillis)
boolean postDelayed(Runnable r, long delayMillis)
将数据对象添加到消息队列。
boolean sendMessage(Message msg)
boolean sendMessageAtFrontOfQueue(Message msg)
boolean sendMessageAtTime(Message msg, long uptimeMillis)
boolean sendMessageDelayed(Message msg, long delayMillis)
将简单的数据对象添加到消息队列。
boolean sendEmptyMessage(int what)
boolean sendEmptyMessageAtTime(int what, long uptimeMillis)
boolean sendEmptyMessageDelayed(int what, long delayMillis)
处理消息
消息由Looper分派并传递给Handler。处理程序将收到此消息并进行处理。处理操作是在处理程序所属的使用者线程上完成的。
消息中有两种消息
任务讯息
有可运行对象,没有数据。
handler.post(new Runnable() {
@Override
public void run() {
//TODO : Do some operation
}
});
数据信息
有数据,不是可运行对象。消息处理在Handler.handleMessage()内部执行。
final Handler handler = new Handler() {
@Override
public void handleMessage(Message message) {
//TODO : Get the data from Message and perform opertation accordingly.
}
};
handler.sendMessage(message);
从队列中删除消息
当我们谈论删除对象时,我们想到的第一件事是它的标识符(identifier)是什么?
讯息识别码
标识符 | 描述 | 适用的消息 |
---|---|---|
Handler | 消息接收器 | 任务和数据消息 |
Object | 消息标签 | 任务和数据消息 |
整数 | 消息的what参数 | 数据信息 |
Runnable | 要执行的任务 | 任务信息 |
管理队列的方法
从消息队列中删除任务
removeCallbacks(Runnable r)
removeCallbacks(Runnable r, Object token)
从消息队列中删除数据消息
removeMessages(int what)
removeMessages(int what, Object object)
从消息队列中删除任务和数据消息
removeCallbacksAndMessages(Object token)
如何跟踪消息队列处理?
Looper.myLooper().setMessageLogging(new LogPrinter(Log.DEBUG, TAG));
让我们看一个跟踪消息的例子
handler.post(new Runnable() {
@Override
public void run() {
Log.d(TAG, "Executing Runnable");
}
});
mHandler.sendEmptyMessage(111);
此代码的输出是
Dispatching to Handler (android.os.Handler) {8226ef40}
com.shim.handlertest.activities.HandlerMessageActivity$1@46590829: 0
Executing Runnable
Finished to Handler (android.os.Handler) {8226ef40}
com.shim.handlertest.activities.HandlerMessageActivity$1@46590829