ViewRootImpl的mThread什么时候赋的值?

news/2025/1/13 11:41:56/

上篇文章:子线程更新主线程的View抛出异常全过程,ViewRootImpl的checkThread方法中,通过mThread来判断,要更新View的线程和创建View的线程,是不是同一个,如果不是就抛出异常。

    void checkThread() {if (mThread != Thread.currentThread()) {throw new CalledFromWrongThreadException("Only the original thread that created a view hierarchy can touch its views.");}}

那么这个mThread是什么时候被赋值的了?

本文目录

  • ViewRootImpl的mThread什么时候赋的值?
  • ViewRootImpl对象什么时候生成的?
  • 其他疑问

ViewRootImpl的mThread什么时候赋的值?

在ViewRootImpl对象生成的时候,也就是ViewRootImpl的构造函数里面赋的值。
/frameworks/base/core/java/android/view/ViewRootImpl.java

public ViewRootImpl(Context context, Display display) {......mThread = Thread.currentThread();......
}

在子线程中更新view的问题

ViewRootImpl对象什么时候生成的?

	//Activity.javavoid makeVisible() {if (!mWindowAdded) {ViewManager wm = getWindowManager();wm.addView(mDecor, getWindow().getAttributes());mWindowAdded = true;}mDecor.setVisibility(View.VISIBLE);}//getWindowManager返回了mWindowManagerpublic WindowManager getWindowManager() {return mWindowManager;}private WindowManager mWindowManager;

ViewManager是一个接口,WindowManager也是一个接口,WindowManager继承自ViewManager。如下:
/frameworks/base/core/java/android/view/ViewManager.java
/frameworks/base/core/java/android/view/WindowManager.java

public interface ViewManager//定义对View的增删改
{public void addView(View view, ViewGroup.LayoutParams params);public void updateViewLayout(View view, ViewGroup.LayoutParams params);public void removeView(View view);
}public interface WindowManager extends ViewManager { //可见WindowManager也提供对View的增删改的接口方法......
}

WindowManager的具体实现类是WindowManagerImpl,我们看看WindowManagerImpl#addView()方法。

@Override
public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {applyDefaultToken(params);mGlobal.addView(view, params, mContext.getDisplayNoVerify(), mParentWindow,mContext.getUserId());
}//mGlobal 是WindowManagerGlobal类的对象
public final class WindowManagerImpl implements WindowManager {private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();......
}

接着看WindowManagerGlobal#addView()方法。
/frameworks/base/core/java/android/view/WindowManagerGlobal.java

public void addView(View view, ViewGroup.LayoutParams params,Display display, Window parentWindow, int userId) {......ViewRootImpl root;View panelParentView = null;synchronized (mLock) {...//创建ViewRootImpl对象root = new ViewRootImpl(view.getContext(), display);//设置View的布局属性view.setLayoutParams(wparams);//将相关信息保存到对应集合mViews.add(view);mRoots.add(root);mParams.add(wparams);try {root.setView(view, wparams, panelParentView, userId);//调用ViewRootImpl对象的setView方法(这里也是View绘制的根源)} catch (RuntimeException e) {...}}
}

在WindowManagerGlobal#addView()方法里,我们看到了ViewRootImpl对象的初始化。

总结:
WindowManagerGlobal的addView()方法里面,生成了ViewRootImpl对象。
在子线程中更新view的问题
Window和WindowManager和ViewRootImpl

看到这里,继续追问:ViewRootImpl的初始化确定是在主线程吗?这个问题比较复杂,后面的文章,接着分析。

其他疑问

  • WindowManager与ViewRootImpl是什么关系?
    WindowManagerGlobal有存储ViewRootImpl的集合,mRoots。
    Window和WindowManager和ViewRootImpl

  • mRoots是干啥的?
    存储所有的ViewRootImpl。

  • Global为什么要保存ViewRootImpl?
    后面会需要查询。

  • 一个 Activity 有多少个 ViewRootImpl?
    ViewRootImpl 是实际管理 Window 中所有 View 的类,每个 Activity 中 ViewRootImpl 数量取决于调用mWindowManager.addView() 的次数。
    Framework篇 - 一文搞懂 Activity、View、Window、ViewRootImpl


http://www.ppmy.cn/news/293621.html

相关文章

用js开发一个简单的谷歌插件

要开发一个谷歌插件,我们首先需要了解一下插件的基本架构和工作原理。 下面是编写谷歌插件简要的步骤: 1.确定插件类型:谷歌提供了多种不同类型的插件,您需要根据插件的具体需求来选择合适的类型。 2.编写manifest.json文件&am…

重命名文件名也可以很优雅,看看这些技巧

文件重命名对于许多工作场景来说是非常重要的。比如,当你需要整理大量文件时,一个好的文件命名系统可以帮助你更轻松地管理和查找文件。但是,当需要重命名大量文件时,逐个重命名显然是非常耗时和繁琐的。这时,批量重命…

《哈迪斯:杀出地狱》:超爽的地狱逃生之旅

作为一款18年底就让玩家抢先体验的APRGRougelike类型游戏,随着持续的更新,“哈迪斯:杀出地狱”出色的融合了地牢ARPG与Rougelike元素,而其中超爽的战斗体验更是让玩家停不下来,那么哈迪斯是如何带给玩家畅快爽感的呢&a…

地狱管理系统

前段时间在网上看到一篇关于阎王让我设计一套地狱管理系统,作者调侃就差技术介入了,于是利用闲余时间跟风开发了一下,没有全部完成,只是搭了一个架子,后续慢慢完善。 在线预览demo:https://sunbaoxu.githu…

通往天堂的地狱

【上海5期甘瑶瑶:通往天堂的地狱】人生不只是眼前的苟且,还有梦想和远方。世界上最恐怖的事,就是比你优秀的人比你还努力。和小伙伴们起早摸黑,披星戴月,晚上11点半才走上回宿舍的道路。上海的夜晚很安静,只…

Win10系统怎么打开网上邻居

Win10系统打开网上邻居的步骤 通常我们安装完系统之后,桌面都会显示网上邻居,可是有用户升级到win10专业版系统之后,却发现没有网上邻居,那么要网上邻居在哪呢,该怎么打开网上邻居呢? 下面随微点阅读小编…

什么是回调地狱?

在回调函数里面嵌套回调函数,这样的就叫回调地狱,例如ajax发多个请求的时候,下一次请求要用要上一次请求的结果,这种嵌套的回调函数就是回调地狱。 什么叫回调函数呢? 就是在调用函数时,把函数体作为实参传…

邻居1

住我隔壁的是一家四川人,一家四口,一对小夫妻加个小孩,还有小孩奶奶,我偶尔到他 们家串门,他们房子很大,八十平方以上,三房一厅,家具电器该有的都有,不该有的都没有&…