2012-03-09 66 views
0

我有一个长期运行的操作的应用程序。我正在使用AsyncTask。在其onPostExecute()我认为这种修改一些视图的功能。我上被修改10次第五届观呼唤的setEnabled收到此错误。它很少发生,从用户那里得到奇怪的错误报告。

显然,一个多线程的问题。但我认为onPostExecute()总是在UI线程上运行?难道是UI线程突然变成另一个线程?

堆栈跟踪:

产生以下异常: android.view.ViewRoot $ CalledFromWrongThreadException:只有创建视图层次可以触摸其观点原来 线程。

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

  1. android.view.ViewRoot.checkThread(ViewRoot.java:3041)
  2. 机器人。 view.ViewRoot.invalidateChild(ViewRoot.java:647)
  3. android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:673)
  4. android.view.ViewGroup.invalidateChild(ViewGroup.java:2511)
  5. 机器人.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)
+0

实际上,它并未在UI线程上调用,而是在创建AsyncTask的线程上调用。这就是为什么文档说:'任务实例必须在UI线程上创建。' – Selvin 2012-03-09 11:52:34

回答

0

但我认为onPostExecute()始终运行在UI线程上?

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

难道是在UI线程一下子得到改变到另一个线程?

不是。更可能的是,您意外地正在更新UI的doInBackground()中的代码路径。

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

+0

添加堆栈跟踪。它正在从onPostExecute() – Yossi 2012-03-09 16:16:43

+0

@Yossi调用:你没有添加堆栈跟踪。 – CommonsWare 2012-03-09 16:18:25

+0

现在添加,对不起。 – Yossi 2012-03-09 16:19:48