1. Looper 方法
Looper 的作用:
- 循环读取 MessageQueene 内的 Message
- 将 Message 派发给 Handler 执行
Looper.prepareMainLooper(); // 为当前进程创建 Looper,一般是在应用进程初始化的时候调用 main 方法里面实现的,初始化函数
Looper.getMainLooper(); // 获取主线程的 Looper
Looper.loop(); // 开始当前的 Looper 执行,配套 prepareMainLooper() 内使用。作用:循环取出 MessageQueene 内的 message 并交给 Handler
Looper.prepare(); // 为当前线程设置 mLoop
MessageQueene
Looper
Handler
Message
流程:
- Handler 调用 sendToTarget() 方法将 Message 发送到 MessageQueene 内;
- MessageQueene 会调用 enqueueMessage() 方法将 Message 存储;
- Looper 流程是在 prepareMainLooper 方法内初始化,之后就调用 loop() 方法一直循环读取 MessageQueue 中的 Message 消息(在 MessageQueene 方法的 next() 方法内),并最终调用
msg.target.dispatchMessage(msg);
方法将消息推出去 - Handler 处理消息,逐次调用
dispatchMessage(msg)
方法,会调用到handleMessage
方法,使用时会重写这个方法处理最终的消息
参考博客:https://blog.csdn.net/qq_30379689/article/details/53394061
3. Handler 主线程回调示例
private Thread mThread;
private final int MSG_SUCCESS = 1;
if (mThread == null) {
mThread = new Thread(runnable);
Dialog dialog = DialogUIUtils.showMdLoading(this, "加载中...", true, true, true, true).show();
mDialog = dialog;
mThread.start();
}
Runnable runnable = new Runnable() {
@Override
public void run() {
List<AppInfo> appInfos = PackageInfoUtils.getAppInfoList(DUVCore.get().getContext());
Log.i("Wooo", "--runnn---" + appInfos);
mHnadler.obtainMessage(MSG_SUCCESS, appInfos).sendToTarget();
}
};
private Handler mHnadler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_SUCCESS:
mAppInfos = (List<AppInfo>) msg.obj;
showListView(mAppInfos);
Log.i("Wooo", "--mhandle---" + mAppInfos);
break;
}
}
};