android.view.ViewRootImpl$CalledFromWrongThreadException
16lz
2021-12-04
android.view.ViewRootImpl$CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.
(只有创建了UI对象的主线程才能去修改UI)
解决方案一:
在 Android 不是线程安全的, Android 有阻止子线程更新 UI 的机制。在 Android 编程中,需要在主线程之外的一个单独的子线程中进行某些耗时操作,然后更新用户界面显示。但是,在主线程之外的线程中直接更新 UI 显示的问题是:系统会报这个异常,必须在程序的主线程(也就是 UI 线程)中进行更新界面显示的工作。于是我们应该将 UI 的更新交给主线程来完成,Android为我们提供了一套消息处理机制。
实现步骤:
在 Activity 的 onCreate(Bundle savedinstancestate){} 中创建一个Handler类的实例 mHandler,在这个mHandler 实例的 handleMessage(msg) 方法的回调方法中调用更新界面显示的方法。例如:
public class ExampleActivity extends Activity { Handler h = null; @override public void onCreate(Bundle savedinstancestate){ h = new Handler(){ @override public void handleMessage(Message msg){ // call update gui method. } }; } }
在其它的函数中,利用 send族或post族函数向这个 mHandler 发送或邮寄消息即可。
如果使用 Handler 后还是会报这个错,就 把 handleMessage(msg)改成sendMessage(msg) 试试。
解决方案二:
利用 activity.runOnUiThread(new Runnable(){}),把更新 UI 的代码创建在 runnable 中,然后在需要更新 UI 时,把这个 Runnable 对象传给 activity.runOnUiThread(runnable) 。 这样 runnable 对像就能在ui程序中被调用。
getActivity().runOnUiThread(new Runnable() { @Override public void run() { } });
更多相关文章
- android一句话实现APP自动更新(带通知栏)
- Android五种Toast显示样式
- Android(安卓)SDK 在线更新镜像服务器资源
- android 2.3 webkit
- Android优秀开源项目
- Android实现多层级Spinner列表选项实时更新树形层级
- Android中的消息机制
- 史上最好用的Android全量版本更新库XUpdate使用指南
- Android热更新之so库的热更新