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.
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!
Sie versuchen, in Ihrem Fall innerhalb der Methode doInBackground()
auf UI-Komponenten (View) zuzugreifen. Sie dürfen das nicht tun .
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:
Dann rufen Sie in der Hintergrundmethode publishProgress(value as String)
auf, die automatisch die Methode onProgressUpdate
aufruft, die den Haupt-UI-Thread verwendet:
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)
Ein wenig mehr Details
Problem :
postInvalidate()
-Methode (und ihre Varianten), die dies sein kann von außerhalb des UI-Threads View
) von außerhalb des UI-Threads - doInBackground()
läuft auf einem Hintergrundthread Lösung :
onPostExecute()
- sie wird ausgeführt auf dem UI-Thread Activity
und verwenden Sie deren runOnUiThread(Runnable)
Methode View
post...()
Tags und Links android android-asynctask exception