能否在非UI线程更新界面呢?

来源:互联网 发布:樊少皇为什么不红 知乎 编辑:程序博客网 时间:2024/05/27 00:58

简要总结爱哥文章:http://blog.csdn.net/aigestudio/article/details/43449123

结论:

可以,阻碍非UI线程更新UI的是ViewRootIml类的checkThread().所以在ViewRootIml未创建前是可以更新UI的。ViewRootIml是在addView中Create哦。


handleResumeActivity方法逻辑相对要复杂一些,除了一啪啦对当前显示Window的逻辑判断以及没创建的初始化等等工作外其在最终会调用Activity的makeVisible方法:

public class Activity extends ContextThemeWrapper          implements LayoutInflater.Factory2,          Window.Callback, KeyEvent.Callback,          OnCreateContextMenuListener, ComponentCallbacks2 {      // 省去海量代码…………………………        void makeVisible() {          if (!mWindowAdded) {              ViewManager wm = getWindowManager();              wm.addView(mDecor, getWindow().getAttributes());              mWindowAdded = true;          }          mDecor.setVisibility(View.VISIBLE);      }        // 省去巨量代码……………………  }  


在makeVisible方法中逻辑相当简单,获取一个窗口管理器对象并将我们曾在自定义控件其实很简单7/12中提到过的根视图DecorView添加到其中,addView的具体实现在WindowManagerGlobal中:
public final class WindowManagerGlobal {      public void addView(View view, ViewGroup.LayoutParams params,              Display display, Window parentWindow) {          // 省去很多代码            ViewRootImpl root;            // 省去一行代码            synchronized (mLock) {              // 省去无关代码                root = new ViewRootImpl(view.getContext(), display);                // 省去一行代码                // 省去一行代码                mRoots.add(root);                // 省去一行代码          }            // 省去部分代码      }  }  
没错,可以执行!首先我们这里的是个线程,其次这里要涉及framework对UI事件处理的方式,我们在Android翻页效果原理实现之引入折线中曾说过Android对UI事件的处理需要依赖于Message Queue,当一个Msg被压入MQ到处理这个过程并非立即的,它需要一段事件,我们在线程中通过Thread.sleep(200)在等,在等什么呢?在等ViewRootImpl的实例对象被创建,有关于GUI中Message Queue的处理如有机会我会浓缩在《深入理解 Android GUI 框架》系列中,这里就暂且先不说了。
.

0 0