Kein Fehler "Nur der ursprüngliche Thread, der eine Ansichtshierarchie erstellt hat, kann seine Ansichten berühren", wenn die Ansicht ohne Verzögerung aktualisiert wird

8

Ich war mit einem interessanten Problem konfrontiert. Wenn Sie in der onCreate/onStart/onResume -Methode der Aktivität den folgenden Code schreiben:

%Vor%

oder:

%Vor%

Wie es sein sollte, wird ein Fehler geworfen

%Vor%

Es ist klar, dass ich in diesem Fall die Ansicht in ui-thread aktualisieren muss (Handler, AsyncTask, runOnUiThread, view.post).

Wenn Sie jedoch die Ansicht in einem anderen Thread ohne Verzögerung aktualisieren (ohne den Sleep-Aufruf oder ohne den Thread durch Drücken einer Schaltfläche zu starten), wird die Ausnahme nicht ausgelöst .

%Vor%

Kann mir jemand sagen, warum es so ein Verhalten gibt?

UPDATE:

Ich habe den Quellcode von Android gelernt und kam zu folgenden Schlussfolgerungen.    Nandeesh schrieb die Wahrheit. Bei der Initialisierung der Ansicht namens dispatchAttachedToWindow (AttachInfo-Info, Int-Sichtbarkeit) Methode der Ansicht, die das Feld mAttachInfo initialisiert. Das Objekt "mAttachInfo" hat das Feld "mViewRootImpl". Wenn es null ist, wird getViewRootImpl als null zurückgegeben:

%Vor%

ViewRootImpl enthält die checkThread-Methode. Es vergleicht Threads: der Thread, der die Ansicht und den Thread der Anforderung für die Ansichtsaktualisierung erstellt hat.

%Vor%

Wenn also die Ansicht nicht initialisiert wurde, gibt es keine Prüfung und Änderung, es werden keine Ausnahmen ausgelöst.

    
Vladimir Ryhlitskiy 25.10.2012, 07:11
quelle

1 Antwort

9

Die Überprüfung auf Thread ist nur vorhanden, wenn textView relayout ausgeführt wurde. Das Layout der Ansicht erfolgt jedoch erst, nachdem OnCreate aufgerufen wurde. Bis das Ui nicht angezeigt wird, führt das Ändern von textView nicht zum Ungültigmachen der Ansicht.

Aber sobald die textView angezeigt wurde, ist das UI-relayout erforderlich. In diesem Fall wird der Thread überprüft. So bekommst du die Ausnahme erst nach einiger Zeit von Oncreate aber nicht sofort.

    
nandeesh 25.10.2012, 07:56
quelle