本文介绍了Android的活套和调用堆栈的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不知道如何弯针类实际上是在线程处理的Runnable(通过Handler类)的活套连接到?如果一个活套是通过其循环的MessageQueue那么肯定,这将是该线程阻塞操作?我想它本身必须执行一些挂羊头卖狗肉穿线但它是如何添加发布的Runnable run()方法到主机线程栈?

很多问题!任何帮助将是非常美联社preciated。谢谢!

编辑:

通过尺蠖<一个展望href=\"http://$c$csearch.google.com/$c$csearch#uX1GffpyOZk/core/java/android/os/Looper.java&q=package%3aandroid.git.kernel.org%20file%3aandroid/os/Looper.java&l=1\"相对=nofollow>类文件类我看到下面的,它混淆了我更加为所有评论指在主线程,而且运行的尺蠖在等待有关的MessageQueue新邮件的阻塞操作。这是如何不堵UI /主线程?

  / **
     *运行在这个线程消息队列。一定要打电话
     * {@link #quit()}结束循环。
     * /
    公共静态最后的无效循环(){
        尺蠖我= myLooper();
        的MessageQueue队列= me.mQueue;        //确保该线程的身份是当地的过程中,
        //并跟踪是什么身份令牌实际上是。
        Binder.clearCallingIdentity();
        最终长的ident = Binder.clearCallingIdentity();        而(真){
            消息味精= queue.next(); //可能会阻止
            //如果(!me.mRun){
            //突破;
            //}
            如果(MSG!= NULL){
                如果(msg.target == NULL){
                    //没有目标是一个神奇的标识符退出消息。
                    返回;
                }
                如果(me.mLogging!= NULL)me.mLogging.println(
                        &GT;&GT;&GT;&GT;&GT;调度为+ msg.target +
                        + msg.callback +:+ msg.what
                        );
                msg.target.dispatchMessage(MSG);
                如果(me.mLogging!= NULL)me.mLogging.println(
                        &LT;&LT;&LT;&LT;&LT;成品为+ msg.target +
                        + msg.callback);                //该调度过程中确保
                //线程的标识没有损坏。
                最终长newIdent = Binder.clearCallingIdentity();
                如果(IDENT!= newIdent){
                    Log.wtf(活套,线程标识从0X改为
                            + Long.toHexString(IDENT)+来0X
                            + Long.toHexString(newIdent)+,同时指派给
                            + msg.target.getClass()。的getName()+
                            + msg.callback +什么=+ msg.what);
                }                msg.recycle();
            }
        }
    }
    / **
     *返回应用程序的主尺蠖,它生活在应用程序的主线程。
     * /
    公共同步静态最终活套getMainLooper(){
        返回mMainLooper;
    }   / **
     *返回与当前线程相关的Looper对象。返回
     * NULL如果调用线程不与活套有关。
     * /
    公共静态最后的活套myLooper(){
        返回(活套)sThreadLocal.get();
    }    // sThreadLocal.get()将返回null,除非你叫prepare()。
    私有静态最后的ThreadLocal sThreadLocal =新的ThreadLocal();    / **初始化当前线程作为一个活套。
      *这给你一个机会,建立处理程序然后引用
      *此尺蠖,实际开始循环之前。一定要打电话
      * {@link #LOOP()}调用此方法后,并通过调用它结束
      * {@link #quit()}。
      * /
    公共静态最终无效prepare(){
        如果(sThreadLocal.get()!= NULL){
            抛出新的RuntimeException(只有一条环线可以每个线程创建);
        }
        sThreadLocal.set(新活套());
    }


解决方案

好吧,看着周围堆栈,我发现一个问题,回答我的。我的主要困惑是从没有从this帖子。我被错误地以为一切的除了张贴到处理程序的东西(并加入到活套的MessageQueue)正在以线性调用栈执行,但​​考虑它,这是更可能如何与一个UI任何程序被执行,并且使一个更有意义的UI线程上的每一件事情源于活套,并在此线程excecution的所有路径会导致回吧!感谢Berdon企图回答我的问题,我确定我没有解释我的问题不够好:)

这篇关于Android的活套和调用堆栈的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-12 09:54