Android Handler

摘要: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详解

2、Android中关于Handler的若干思考

3、Android -- Looper.prepare()和Looper.loop() —深入版

4、android的消息处理机制(图+源码分析)——Looper,Handler,Message


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值