首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

android.view.ViewRootImpl$CalledFromWrongThreadException:Only创建视图层次结构的原始线程可以接触它的视图

android.view.ViewRootImpl$CalledFromWrongThreadException是Android开发中的一个异常,表示在非主线程中访问了UI视图层次结构。在Android中,UI操作必须在主线程中进行,否则会抛出该异常。

该异常的出现通常是由于以下原因之一:

  1. 在非主线程中更新UI:Android要求所有UI更新操作都必须在主线程中进行,如果在其他线程中直接更新UI,就会抛出该异常。
  2. 异步任务中的UI操作:在异步任务(AsyncTask)中,如果在后台线程中更新UI,也会导致该异常的发生。

为了解决这个问题,可以采取以下措施:

  1. 使用主线程更新UI:确保所有UI更新操作都在主线程中进行。可以使用Handler、runOnUiThread()方法或者View.post()方法来将UI操作发送到主线程执行。
  2. 使用AsyncTask正确更新UI:在AsyncTask中,通过重写onPostExecute()方法,在该方法中更新UI,因为该方法会在主线程中执行。
  3. 使用Handler进行线程间通信:如果需要在其他线程中更新UI,可以使用Handler进行线程间通信,将UI操作发送到主线程执行。

腾讯云提供了一系列与移动开发相关的产品和服务,其中包括:

  1. 腾讯移动分析(https://cloud.tencent.com/product/ma):提供移动应用的用户行为分析、统计和可视化报表,帮助开发者了解用户行为和应用性能。
  2. 腾讯移动推送(https://cloud.tencent.com/product/tpns):提供移动应用消息推送服务,支持多种推送方式和个性化推送策略。
  3. 腾讯移动直播(https://cloud.tencent.com/product/mlvb):提供高清、低延迟的移动直播解决方案,支持实时音视频传输和互动功能。
  4. 腾讯移动短信(https://cloud.tencent.com/product/sms):提供短信验证码、营销短信等短信服务,支持全球范围内的短信发送。

通过使用腾讯云的移动开发相关产品,开发者可以更方便地实现移动应用的功能和服务,并提升用户体验。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

关于getResponseCode()出现一些错误

$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its...Android中相关view和控件操作都不是线程安全,所以Android才会禁止在非UI线程更新UI,对于显式非法操作,比如说直接在Activity里创建线程,然后直接在子线程中操作UI等,Android...而对于隐式非法操作,App不会直接简单粗暴地异常退出,只是出现奇怪结果,Only the original thread that created a view hierarchy can touch...its views便是一个例子,字面意思是只有创建视图层次结构原始线程才能操作View,明显是线程安全相关。...在4.0之后谷歌强制要求连接网络不能在主线程进行访问 只有主线程(UI线程)才可以更新UI

34410

线程与更新UI,细谈原理

先看看崩溃日志: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created...(DOM是一种文档对象模型,他层次结构是除了顶级元素,所有元素都被包括到另外元素节点中,有点像家谱树结构,很典型就是html代码解析) 到这里,一个有完整view结构DecorView就创建出来了...currentThread不是mThread时候,就会崩溃,报错误是 “只有创建视图层次结构原始线程才能触摸视图” ,看到这里是不是猜到一些了,这个mThread难道就是“创建视图原始线程”...所以我们就可以得知崩溃真正原因,就是当前线程不是ViewRootImpl创建时候线程就会崩溃。...翻译还是比较准确,只有创建视图原始线程才能修改这个视图,听起来也蛮有道理,我创造了你才有权利改变你,有那味了。

79820

可能是全网最简单透彻安卓子线程更新 UI 解析

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view...,异常起点在最下面,最顶上是抛出异常方法栈,我们只需从下往上就可以知道方法调用顺序了,跟着 TextView 源码从 setText() 里去查看源码,setText()方法经过多次跳转进入以下方法...ViewRootImpl 是在哪里实例化,作为单线程模型,我们可以从 应用 Java 层入口,ActivityThread 也就是 UI 线程实现类去查看 1131 private class...H Handler实例是核心中核心,关键中关键,一句话,我们所有消息都需要通过处理分发,Activity 生命周期、用户触碰事件,一切反馈都是通过这个来交互,如果没有这个,应用就会像一个...= Thread.currentThread()) { 4746 throw new CalledFromWrongThreadException( // 只有创建视图层次结构原始线程才能访问视图

1.1K10

线程 真的不能更新UI ?

我们从一个异常说起: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created...翻译就是说 只有创建了view树线程,才能访问子view。并没有说子线程一定不能访问UI。...那可以猜想到,button的确实是在子线程被添加到window中,子线程确实可以直接访问,而主线程访问确实会抛出异常。看来可以解释这个错误原因了。 下面就具体分析下。...一般情况,UI就是指Activityview,这也是我们通常称主线程为UI线程原因,其实严谨叫法应该是activityUI线程。而我们这个例子中,这个子线程可以称为buttonUI线程。...另外注意2,在activityonCreate到首次onResume时期,创建线程在其中更新UI也是可以。这不是违背上面的结论了吗?

1.2K10

笔记55 | 处理CalledFromWrongThreadException错误问题

报错说明 直接在子线程更新UI会报CalledFromWrongThreadException错,错误如下: 12-20 15:39:04.730: E/AndroidRuntime(2763):...FATAL EXCEPTION: Timer-0 12-20 15:39:04.730: E/AndroidRuntime(2763): android.view.ViewRootImpl$CalledFromWrongThreadException...: Only the original thread that created a view hierarchy can touch its views. 12-20 15:39:04.730: E/AndroidRuntime...04.730: E/AndroidRuntime(2763): at java.util.Timer$TimerImpl.run(Timer.java:284) 为什么会出现这个问题,这里有一篇大神解答关于为什么不能再子线程中更新...UI讨论大神对代码解读能力让人兴叹,总结来说是因为子线程没有创建Looper.prepare()这个与子线程不能Toast问题是一样Toast为什么不可以在子线程里面运行 ---- 解决方案 1

1.6K40

Android开发(第一行代码 第二版) 常见异常和解决办法(基于Android Studio)(二)

4.使用Android中消息机制解决:Only the original thread that created a view hierarchy can touch its views 原始代码 public...原因在于,Android系统中视图组件并不是线程安全,如果要更新视图,必须在主线程中更新,不可以在子线程中执行更新操作。...Message msg = new Message(); msg.what = COMPLETED; handler.sendMessage(msg); } } } 通过上面这种方式,我们就可以解决线程安全问题...,把复杂任务处理工作交给子线程去完成,然后子线程通过handler对象告知主线程,由主线程更新视图,这个过程中消息机制起着重要作用。...Android消息循环是针对线程,每个线程可以有自己消息队列和消息循环。

1.6K30

2014-10-27Android学习------程序源码+知识总结------城市列表应用程序

说白了就是注意一点:invalidate不能再线程中直接使用,但是可以在UI线程中直接使用,postinvalidate可以直接在线程中使用 我们在应用程序中类是继承View,它就是一个UI线程,那么它就可以直接使用了...强行访问的话会报:android.view.ViewRoot$CalledFromWrongThreadExceptionOnly the original thread that created a...这时候你需要创建一个继承了android.os.Handler子类,并重写handleMessage(Message msg)方法。...也就是说:在新线程创建并发送一个Message,然后再主线程中捕获、处理该消息。 3.使用多线程和双缓冲 Android中SurfaceView是View子类,她同时也实现了双缓冲。...直接在R.java中去找 3.实现自己自定义Adapter需要去继承BASEAdapter,BaseAdapter是没有做任何数据处理,所以你需要重载四个函数 @Override public

29130

面试?看完这篇就够了-深入分析从点击应用图标到应用界面展示

= Thread.currentThread()) { throw new CalledFromWrongThreadException( "Only...Zygote 进程在系统启动时创建预加载了许多常用类和资源,为应用程序进程提供了一个初始化好运行环境。当需要创建应用程序进程时,系统会通过 Zygote 进程来 fork 出新进程。...任何线程可以更新自己创建 UI,只需要满足以下两种情况在 ViewRootImpl 创建之前,可以在子线程更新 UI,比如在 Activity onCreate 时候在 ViewRootImpl...创建之后,只需要保证创建 ViewRootImpl 线程和更新 UI 线程是同一个就可以;比如我们在子线程调用 ViewManager#addView我们同上说子线程可以更新 UI,这个异常是在...= Thread.currentThread()) {          throw new CalledFromWrongThreadException(                  "Only

24430

面试官问我:Andriod为什么不能在子线程更新UI?

卧槽,不按套路出牌啊,果然漂亮女人都难搞定。 1)首先,并非在子线程里面更新UI就一定有问题,如下所示代码,则可以完美更新UI。...$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its..."Only the original thread that created a view hierarchy can touch its views."); } } 如果当前线程不是主线程...可以讲讲吗? 我想...大概,可能是ViewRootImp还没有创建出来吧,所以没有走到checkThread()方法。...到这里可以事后一支烟了,不是,是总结一下了: 1)ViewRootImpl是在ActivityonResume()方法后面创建出来,所以在onResume之前UI更新可以在子线程操作而不报错,因为这个时候

80401

Android采坑之路(一):怀疑人生,主线程修改UI也会崩溃?

$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its...$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its...mThread = Thread.currentThread(); ...代码省略... } 可以发现全类只有这一处对mThread进行了赋值。...已经是顶级View了,parent应该就是ViewRootImpl,那么为什么ViewRootImpl是null呢,明明之前已经show过了。...PS:本人还得吐槽一下Android,Android官方一方面明明宣称不能在主线程以外线程进行UI更新,另一方面在初始化ViewRootImpl时候又不把主线程作为成员变量保存起来,而是直接获取当前所处线程作为

4.6K20

Unity性能调优手册3:分析工具,Profile,FrameDebugger,MemoryProfiler,HeapExplorer

然而,所显示信息表明所选线程所花费时间。例如,如果您正在使用作业系统或多线程呈现,则不包括另一个线程处理时间。如果您想要检查,您可以通过选择如图3.8所示线程来进行检查。...在这种情况下,Raw Hierarchy原始层次结构视图在本例中使用。Raw Hierarchy视图与Hierarchy视图不同之处在于Calls总是固定为1。...Tips 当打开一个项目时,通常会有一个很深层次结构。在这种情况下,您可以通过按住Mac上Option键(Windows上Alt键)打开层次结构所有级别。...相反,按住键关闭一个项目将关闭该层次结构所有内容 timeline view 在时间轴视图中,层次视图项目显示为方框,因此在查看整个视图时,您可以直观地看到加载位置。...因为它是鼠标可访问,即使是深层层次结构可以通过拖动来掌握。此外,有了时间线,就不需要切换线程;显示所有线程。这样就可以很容易地看到每个线程中什么时候发生了什么类型处理。

77321
领券