/ / sporadisch ViewRoot $ CalledFromWrongThreadException - Android, Ansicht, Thread-Sicherheit, Android-asynctask

sporadisch ViewRoot $ CalledFromWrongThreadException - Android, View, Thread-Sicherheit, Android-asynctask

Ich habe eine App mit einer langen laufenden Aktion. Ich verwende AsyncTask. In seiner onPostExecute () rufe ich eine Funktion auf, die einige Ansichten verändert. Ich erhalte diesen Fehler beim Aufrufen von setEnabled in der 5. Ansicht von 10 Ansichten, die geändert werden. Und es kommt sehr selten vor, einen gelegentlichen Fehlerbericht von Benutzern zu bekommen.

Offensichtlich ein Multithreading-Problem. Aber ich dachte onPostExecute () läuft immer auf dem UI-Thread? Könnte es sein, dass der UI-Thread plötzlich in einen anderen Thread geändert wird?

Stack Trace:

die folgende Ausnahme generiert: android.view.ViewRoot $ CalledFromWrongThreadException: Nur das Original Der Thread, der eine Ansichtshierarchie erstellt hat, kann seine Ansichten berühren.

--------- Anweisungsstapelspur ---------

  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)

Antworten:

0 für die Antwort № 1

Aber ich dachte onPostExecute () läuft immer auf dem UI-Thread?

Ja tut es. Per Selvins Kommentar, AFAIK, wenn du versuchst, ein AsyncTask aus einem anderen Thread schlägt es fehl.

Könnte es sein, dass der UI-Thread plötzlich in einen anderen Thread geändert wird?

Nein. Wahrscheinlicher ist, dass Sie versehentlich einen Codepfad in doInBackground() das aktualisiert die Benutzeroberfläche.

Wenn Sie einen vollständigen Stack-Trace haben, der zeigt, dass Sie diese Ausnahme von der Logik erhalten, die in ausgeführt wird onPostExecute()Bitte bearbeiten Sie Ihre Frage und fügen Sie diese Stack-Trace ein.