ViewRoot类的成员函数invalidateChild首先调用另外一个成员函数checkThread来检查当前正在执行的是否是一个UI线程。如果不是的话,ViewRoot类的成员函数checkThread就会抛出一个异常出来。这是因为所有的UI操作都必须要在UI线程中执行。        ViewR
原创 2012-12-31 00:55:01
1125阅读
一. Andoid消息机制概述Android规定访问UI只能在主线程进行,如果在子线程中访问UI,那么程序就会抛出异常。ViewRootImpl对UI操作做了验证,这个验证工作是由ViewRootImpl的checkThread方法来完成的,如下:void checkThread(){ if(mThread != Thread.currentThread()){//不是主线程,抛出异常
我们从一个异常说起:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. at android.view.ViewRootImpl.checkThread(ViewRoot
原创 2022-01-11 16:29:59
114阅读
我们从一个异常说起:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. at android.view.ViewRootImpl.checkThread(ViewRoo
为什么不能在子线程更新UIandroid.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. at android.view.ViewRootImpl.checkThread(View
原创 2023-06-22 13:29:53
301阅读
首先,探讨一个问题, android的UI操作只能在UI线程(即主线程)操作,为什么呢? 原因如下: android在invalidate()时,会进行判断,如下: void checkThread() { 2. if (mThread != Thread.currentThread()) { 3. throw new CalledFromWr
转载 6月前
28阅读
前言 在Android开发过程中,需要更新界面的UI。而更新UI是官方规定必须要主线程(ui线程)来更新的,即UI线程更新。如果在主线线程之外的线程中直接更新页面显示会报错。 延伸 学过JAVA的都知道:异常是类的内部抛出来的:查看异常源码果然 void checkThread() { if (mThread != Thread.currentThread()) { t
转载 2023-06-28 23:43:34
43阅读
Android的消息机制只要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑。 Handler是Android消息机制的上层接口,这使得开发过程只需要和Handler交互即可。由于Android开发的限制,不能再子线程中访问UI控件,否则会触发程序异常(由ViewRootImp 的checkThread方法完成,throw Called
参考自: 异步更新UI的五种方式一、为什么不能在主线程更新UIViewRootImpl通过 checkThread() 方法检查更新UI操作是否是在主线程当中原因:Android的UI是线程不安全的,存在并发访问的问题。加锁也不合适: 加锁会让UI访问的逻辑变得复杂加锁会降低UI访问的效率,因为锁会阻塞某些线程的执行直接在子线程修改UI@Override protected void
一 概述Handler主要被用来在子线程中访问UI线程,在ViewRootImpl中有一个checkThread()方法,对UI的操作都会有此验证。所以操作UI只能在主线程中进行。概念:Handler的运行由底层MessageQueue和Looper支撑。MessageQueue消息队列,单链表存储消息列表。它是消息的存储单元。Looper循环,它会无限循环查找是否有消息,有就处理掉。Looper
转载 3月前
65阅读
View的绘制是单线程模型,view的创建与更新需要在同一个线程(绘制前会checkThread()) 每向系统中添加一个view,就会构造一个ViewRoot对象ViewRoot的构造会记录当前线程,之后更新view的时候会检查线程。View的绘制是非线程安全的,多线程下绘制view,容易出错。在子线程中创建view,并在子线程中更新,是可行的。Android之为什么只能在UI线程操作Vi
我们为什么需要Android的消息机制 我们知道,Android规定访问UI只能在主线程中进行。若在子线程中访问UI,就会抛出异常。这个验证由ViewRootImpl的checkThread方法来完成。 为什么不允许在非主线程访问UI呢,这是因为Android的UI控件不是线程安全的。并发访问会导致控件处于不可预期的状态。 那为什么不对UI访问加上锁机制呢,原因如下: (1)这显然会让UI
Handler机制: 原理:Handler机制是安卓提供的一套切换线程操作的工具。使用的场景:应用一般在子线程加载网络数据,然后需要将获取的数据给到视图层做展示。此过程需要切换到主线程然后做更新UI的操作。此时我们会提出一个问题:就是为什么要切换到主线程更新UI在子线程中不能更新么? 答案是不可以的。因为在ViewRootImpl类中存在一个checkThread方法用来检查View更新的线程