Android 获取零星ViewRoot$CalledFromErrorThreadException

Android 获取零星ViewRoot$CalledFromErrorThreadException,android,view,thread-safety,android-asynctask,Android,View,Thread Safety,Android Asynctask,我有一个长时间运行的应用程序。我正在使用异步任务。在onPostExecute中,我调用了一个修改某些视图的函数。在修改10个视图中的第5个视图上调用setEnabled时,我遇到此错误。而且这种情况很少发生,从用户那里得到奇怪的错误报告 显然是多线程问题。但是我认为onPostExecute总是在UI线程上运行?会不会是UI线程突然变为另一个线程 堆栈跟踪: 生成了以下异常: android.view.ViewRoot$CalledFromErrorThreadException:仅原始 创建

我有一个长时间运行的应用程序。我正在使用异步任务。在onPostExecute中,我调用了一个修改某些视图的函数。在修改10个视图中的第5个视图上调用setEnabled时,我遇到此错误。而且这种情况很少发生,从用户那里得到奇怪的错误报告

显然是多线程问题。但是我认为onPostExecute总是在UI线程上运行?会不会是UI线程突然变为另一个线程

堆栈跟踪:

生成了以下异常: android.view.ViewRoot$CalledFromErrorThreadException:仅原始 创建视图层次结构的线程可以接触其视图

-----指令堆栈跟踪-----

android.view.ViewRoot.checkThreadViewRoot.java:3041 android.view.ViewRoot.invalidateChildViewRoot.java:647 android.view.ViewRoot.invalidateChildInParentViewRoot.java:673 android.view.ViewGroup.invalidateChildViewGroup.java:2511 java:5255 android.view.view.invalidateDrawableView.java:7293 android.graphics.drawable.drawable.invalidateSelfDrawable.java:300 8. drawable.DrawableContainer.selectDrawableDrawableContainer.java:227 9 android.graphics.drawable.StateListDrawable.onStateChangeStateListDrawable.java:99 android.graphics.drawable.drawable.setStateDrawable.java:400 android.view.view.drawableStateChangedView.java:7374 android.view.ViewGroup.drawableStateChangedViewGroup.java:3357 android.widget.FrameLayout.drawableStateChangedFrameLayout.java:164 android.view.view.refreshDrawableStateView.java:7388 android.view.view.setEnabledView.java:3147 com.voltup.powermax.ac.aaActivityAppuiProxy.java:383 com.voltup.powermax.cp.onPostExecuteModeChange.java:1 android.os.AsyncTask.finishAsyncTask.java:417 但是我认为onPostExecute总是在UI线程上运行

是的。根据Selvin的评论AFAIK,如果您尝试从另一个线程创建AsyncTask,它将失败

会不会是UI线程突然变为另一个线程

不。更有可能的是,您在doInBackground中意外地走上了更新UI的代码路径


如果您有一个完整的堆栈跟踪,显示您从onPostExecute中执行的逻辑中获得此异常,请编辑您的问题并粘贴到堆栈跟踪中。

实际上,它不是在UI线程上调用的,而是在创建AsyncTask的线程上调用的。这就是为什么文档会说:任务实例必须在UI线程上创建。添加堆栈跟踪。有人打电话给它onPostExecute@Yossi:您没有添加堆栈跟踪。您从何处获取要启用的视图?是否存在这样的场景:该视图可能在后台线程中创建,但附加到主应用程序线程上的主视图层次结构?我启用的视图是TextSwitcher;我的代码中有几个地方可以切换到新文本;我想我需要找出这些可能在错误的线程上被调用的地方?@Yossi:与其说是在错误的线程上调用,不如说是在错误的线程上创建的。这是我能想到的唯一可以解释这种行为的东西,甚至那只是一个猜测。