получать спорадические ViewRoot $ CalledFromWrongThreadException - PullRequest
0 голосов
/ 09 марта 2012

У меня есть приложение с длительным действием. Я использую AsyncTask. В его onPostExecute () я вызываю функцию, которая модифицирует некоторые представления. Я получаю эту ошибку при вызове setEnabled на 5-м представлении 10 изменяемых представлений И это случается очень редко, получая странные сообщения об ошибках от пользователей.

Очевидно, проблема многопоточности. Но я думал, onPostExecute () всегда работает в потоке пользовательского интерфейса? Может ли быть так, что поток пользовательского интерфейса внезапно изменяется на другой поток ??

Трассировка стека:

сгенерировал следующее исключение: 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.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)
  7. android.graphics.drawable.Drawable.setState (Drawable.java:400)
  8. android.view.View.drawableStateChanged (View.java:7374)
  9. android.view.ViewGroup.drawableStateChanged (ViewGroup.java:3357)
  10. android.widget.FrameLayout.drawableStateChanged (FrameLayout.java:164)
  11. android.view.View.refreshDrawableState (View.java:7388)
  12. android.view.View.setEnabled (View.java:3147)
  13. com.voltup.powermax.ac.a (ActivityAppUiProxy.java:383)
  14. com.voltup.powermax.cp.onPostExecute (ModeChange.java:1)
  15. android.os.AsyncTask.finish (AsyncTask.java:417)

1 Ответ

0 голосов
/ 09 марта 2012

Но я думал, что onPostExecute () всегда работает в потоке пользовательского интерфейса?

Да, это так. Согласно комментарию Селвина, AFAIK, если вы попытаетесь создать AsyncTask из другого потока, произойдет сбой.

Может ли быть, что поток пользовательского интерфейса внезапно будет заменен другим потоком ??

Нет. Скорее всего, вы случайно идете по пути кода в doInBackground(), который обновляет пользовательский интерфейс.

Если у вас есть полная трассировка стека, показывающая, что вы получаете это исключение из логики, выполненной в onPostExecute(), отредактируйте вопрос и вставьте в эту трассировку стека.

...