刚学线程,也搞不懂为什么。。不是都说在子线程更新ui会崩溃吗
您的每一个用心回答,都会让这个世界变得更美好一些!
查4.4代码,子线程更新的错误log和新版不同,处理方式也不同。
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6357)
at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:874)
当更新,触发requestLayout,然后检查了当前线程,如果不是主线程,就奔溃了~~
会不会崩溃得看情况 你可以看看这篇博客《Android:为什么子线程不能更新UI》:https://www.jianshu.com/p/58c999d3ada7
崩不崩溃,看代码。按照这个源码堆栈提示。看看框架代码怎么处理。
代码位置:https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/view/ViewRootImpl.java;drc=master;l=10232?q=ViewRootImpl
log对上,Google也没说那个版本,我估计应该比较高版本。
更ui的时候,对比了下更新的线程的looper是否和主线程对的上,如果不是,就抛出上面log的异常信息。提示开发者这样做是不安全的。
你可以换一个低版本模拟器试试,比如4.4.
在oncreate方法里的代码
new Thread(new Runnable() { @SuppressLint("SetTextI18n") @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } mButton.setText("123456"); } }).start();
查4.4代码,子线程更新的错误log和新版不同,处理方式也不同。
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6357)
at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:874)
当更新,触发requestLayout,然后检查了当前线程,如果不是主线程,就奔溃了~~
会不会崩溃得看情况 你可以看看这篇博客《Android:为什么子线程不能更新UI》:https://www.jianshu.com/p/58c999d3ada7
崩不崩溃,看代码。按照这个源码堆栈提示。看看框架代码怎么处理。
代码位置:https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/view/ViewRootImpl.java;drc=master;l=10232?q=ViewRootImpl
log对上,Google也没说那个版本,我估计应该比较高版本。
更ui的时候,对比了下更新的线程的looper是否和主线程对的上,如果不是,就抛出上面log的异常信息。提示开发者这样做是不安全的。
你可以换一个低版本模拟器试试,比如4.4.
在oncreate方法里的代码