AsyncTask "Nur der ursprüngliche Thread, der eine Ansichtshierarchie erstellt hat, kann seine Ansichten berühren."

8

Ich versuche den Spinner-Inhalt über die AsyncTaks zu ändern, aber ich kann nicht und der Logcat ist geschrieben "09-19 16: 36: 11.189: FEHLER / FEHLER DER (6078): Nur der ursprüngliche Thread, der eine Ansichtshierarchie erstellt hat kann seine Ansichten berühren. ".

%Vor%

Und die Funktion setGroups ist:

%Vor%

Was ist los? Danke.

    
tres.14159 19.09.2011, 16:44
quelle

4 Antworten

24

Wie von Peter erwähnt, können Sie nicht mit doInBackground() auf die Ansichten zugreifen. Sie können dies jedoch in onPostExecute() tun. Dort sollten Sie mit den Ergebnissen doInBackground() return arbeiten, soweit ich weiß.

Ich bin auf dieses Problem gestoßen und habe es behoben, indem ich den Änderungscode für die Ansicht in onPostExecute() verschoben habe.

Für diejenigen unter Ihnen, die sich mit Android-Entwicklung beschäftigen:
  - doInBackground() : was auch immer in einem anderen Thread (im Hintergrund) passiert, unterscheidet sich vom Haupt / Original-Thread, auf dem Ihre Ansichten / Fragmente / Aktivitäten laufen (das ist der ganze Punkt von AsyncTask == & gt; Sie können die Ansichten nicht berühren !
  - onPostExecute() : jetzt sind Hintergrund-Dateien fertig, hier ist es wieder im Haupt / Thread-Thread == & gt; Sie können jetzt die Ansichten berühren!

    
ericn 02.05.2013 04:37
quelle
10

Sie versuchen, in Ihrem Fall innerhalb der Methode doInBackground() auf UI-Komponenten (View) zuzugreifen. Sie dürfen das nicht tun .

    
Peter Knego 19.09.2011 16:48
quelle
3

Wenn Sie den Fortschritt während des Hintergrundprozesses anzeigen möchten, gibt keine der vorherigen Antworten einen Hinweis: Wenn OnPostExecute aufgerufen wird, ist alles fertig, so dass der Status des Ladens nicht aktualisiert werden muss.

Sie müssen also onProgressUpdate in Ihrer AsyncTask überschreiben und sicherstellen, dass das zweite Objekt kein Void ist, sondern eine Ganzzahl oder ein String, der von onProgressUpdate gelesen wird. Zum Beispiel mit String:

%Vor%

Dann rufen Sie in der Hintergrundmethode publishProgress(value as String) auf, die automatisch die Methode onProgressUpdate aufruft, die den Haupt-UI-Thread verwendet:

%Vor%

Im Allgemeinen müssen Sie beim Deklarieren einer AsyncTask die <Params, Progress, Result> -Klassen angeben, die an die Hauptmethoden übergeben werden. Dies können Ihre eigenen Klassen oder nur Java-Klassen sein:

  • doInBackground(Params... params)
  • onProgressUpdate(Progress... value)
  • onPostExecute(Result... success)
Davidea 25.03.2015 14:26
quelle
3

Ein wenig mehr Details

Problem :

  • UI-Elemente können nur im UI-Thread geändert werden. Eine Ausnahme ist ihre postInvalidate() -Methode (und ihre Varianten), die dies sein kann von außerhalb des UI-Threads
  • ausgeführt
  • Der Fehler, den Sie erhalten, wird durch einen Versuch verursacht, ein UI-Element zu ändern (ein View ) von außerhalb des UI-Threads - doInBackground() läuft auf einem Hintergrundthread

Lösung :

  • Ändern Sie die Ansichten in der Methode onPostExecute() - sie wird ausgeführt auf dem UI-Thread
  • erhalten Sie einen Verweis auf die an Activity und verwenden Sie deren runOnUiThread(Runnable) Methode
  • Verwenden Sie abhängig von der Änderung eine der Methoden View post...()
stan0 25.03.2015 16:11
quelle