摘要:Handler是Android类库提供的用于接受、传递和处理消息或Runnable对象的处理类,它结合Message、MessageQueue和Looper类以及当前线程实现了一个消息循环机制,用于实现任务的异步加载和处理。
原理图
问题描述:
在开启的子线程中需要弹出框,并且使用其中的值。然后才执行接下来的代码。
问题分析:
子线程中获取主线程的Looper,然后loop()循环等待消息处理结束。
解决方案:
1)在弹出框中使用 Looper.getMainLooper()获取主线程Looper
启动该弹出框是在子线程中,这里只处理消息,不更新UI。该方法是获取到主线程的Looper。如下是LoopergetMainLooper() 源代码:
/** Returns theapplication's main looper, which lives in the main thread of the application.
*/
public synchronized static final LoopergetMainLooper() {
return mMainLooper;
}
2)使用Looper.loop(),进行循环等待
让Looper开始工作,从消息队列里取消息,处理消息。 写在Looper.loop()之后的代码不会被执行,这个函数内部应该是一个循环,当调用mHandler.getLooper().quit()后,loop才会中止,其后的代码才能得以运行。如下是loop()源码:
/**
* Run the message queue in this thread. Be sure to call
* {@link #quit()} to endthe loop.
*/
public static final void loop() {
Looper me = myLooper();
MessageQueue queue = me.mQueue;
while (true) {
Message msg = queue.next(); // mightblock
//if (!me.mRun) {
// break;
//}
if (msg != null) {
if (msg.target==null) {
// No target is amagic identifier for the quit message.
return;
}
if (me.mLogging!=null) me.mLogging.println(
">>>>>Dispatching to " + msg.target +" "
+ msg.callback + ":" + msg.what
);
msg.target.dispatchMessage(msg);
if (me.mLogging!=null) me.mLogging.println(
"<<<<<Finished to " + msg.target +""
+ msg.callback);
msg.recycle();
}
}
}
3)mHandler.getLooper().quit()进行循环释放,即结束循环
当关闭EditBox后,调用该方法。使得代码往下执行。代码如下:
private void closeDialog()
{
dismiss();
if (handler !=null)
handler.getLooper().quit();
}
参考:
1、Android多线程----异步消息处理机制之Handler详解
3、Android -- Looper.prepare()和Looper.loop() —深入版
4、android的消息处理机制(图+源码分析)——Looper,Handler,Message