得到零星的ViewRoot $ CalledFromWrongThreadException

时间:2012-03-09 11:31:17

标签: android view thread-safety android-asynctask

我有一个长时间运行的应用。我正在使用AsyncTask。在它的onPostExecute()中,我调用了一个修改某些视图的函数。我在修改10个视图的第5个视图上调用setEnabled时收到此错误。它很少发生,从用户那里得到奇怪的错误报告。

显然是一个多线程问题。但我认为onPostExecute()总是在UI线程上运行?可能是UI线程突然变为另一个线程吗?

堆栈追踪:

生成以下异常: android.view.ViewRoot $ CalledFromWrongThreadException:只有原始版本 创建视图层次结构的线程可以触及其视图。

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

  1. android.view.ViewRoot.checkThread(ViewRoot.java:3041)
  2. android.view.ViewRoot.invalidateChild(ViewRoot.java:647)
  3. android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:673)
  4. android.view.ViewGroup.invalidateChild(ViewGroup.java:2511)
  5. android.view.View.invalidate(View.java:5255)
  6. android.view.View.invalidateDrawable(View.java:7293)
  7. android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:300) 8。 android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:227) 9。 android.graphics.drawable.StateListDrawable.onStateChange(StateListDrawable.java:99)
  8. android.graphics.drawable.Drawable.setState(Drawable.java:400)
  9. android.view.View.drawableStateChanged(View.java:7374)
  10. android.view.ViewGroup.drawableStateChanged(ViewGroup.java:3357)
  11. android.widget.FrameLayout.drawableStateChanged(FrameLayout.java:164)
  12. android.view.View.refreshDrawableState(View.java:7388)
  13. android.view.View.setEnabled(View.java:3147)
  14. com.voltup.powermax.ac.a(ActivityAppUiProxy.java:383)
  15. com.voltup.powermax.cp.onPostExecute(ModeChange.java:1)
  16. android.os.AsyncTask.finish(AsyncTask.java:417)

1 个答案:

答案 0 :(得分:0)

  

但我认为onPostExecute()总是在UI线程上运行?

是的,确实如此。 Per Selvin的评论,AFAIK,如果你试图从另一个线程创建一个AsyncTask,它就会失败。

  

可能是UI线程突然变为另一个线程吗?

没有。更有可能的是,您不小心在doInBackground()中更改了UI的代码路径。

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