Erweitern Sie eine Ansicht in einem Hintergrundthread
Ich habe eine ganz einfache Frage:
Ist oder ist es nicht möglich, aufblasen einer Ansicht (nicht fügen Sie es layout) in einen hintergrund-thread (ex: in der doInBackground
einer AsyncTask
)?
Ich weiß, dass es möglich ist, denn ich habe implementiert die meisten Aktivitäten in meiner Anwendung so und hatte nie ein problem, bis ich hatte dieses problem auf einem Galaxy S: Android: android.Blick.InflateException: Binary XML file line #13: Error inflating class <unbekannt> bei SAMSUNG Galaxy S
Mir wurde gesagt, dass ich sollte nicht aufblasen Views
im hintergrund-threads, aber was sind die spezifischen Gründe und warum funktioniert meine Vorgehensweise funktioniert in den meisten Geräten, aber nicht im Galaxy S?
InformationsquelleAutor der Frage pandre | 2011-07-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
LayoutInflater
macht keine Annahmen, was der thread es läuft. Und nichts wird erwähnt über dieses in seiner Dokumentation. Auch seine code-Nähte werden, um thread-Agnostiker.Auf der anderen Seite, Ansichten, die erstellt werden, indem
LayoutInflater
könnte instanziierenHandler
s in Ihren Konstruktoren. Naja, Sie sollte wohl nicht tun, aber es gibt keine Anforderung für Sie nicht mehr zu erstellen/verwendenHandler
s in Ihren Konstruktoren.Meine Vermutung ist, dass Samsung Galaxy S hatte einige änderungen in seinem
EditText
irgendwie Triggern-Erstellung vonHandler
(nach crash-log von deiner anderen Frage InstanzGestureDetector
instanziiert wurde, die wiederum erstellt neueHandler
). Während die Standard-Implementierung nicht tun.Insgesamt würde ich sagen, da es keine explizite Anforderung für
View
s nicht zu verwendenHandler
s undLooper
s in den Konstruktoren können Sie nicht davon ausgehen, aufblasen Ansichten von nicht-UI-thread-safe ist.Können Sie tatsächlich erstellen
HandlerThread
und versuchen, aufblasenView
s drin. Aber ich würde sagen, dies ist sehr riskant, da in Samsung Galaxy S Beispiel die Ansicht geht davon aus, dass dieser thread am Leben sein währendView
Lebensdauer und verarbeitet alle Nachrichten, die über seineLooper
. Die Folge kann ein Absturz später.InformationsquelleAutor der Antwort inazaruk
Mit den neuesten support-lib können Sie
android.Unterstützung.v4.Blick.AsyncLayoutInflater
zum aufblasen views asynchron. Seien Sie aber vorsichtig, dass es fallback auf das aufblasen auf einen UI-thread, wenn bestimmte Voraussetzungen nicht erfüllt sind:InformationsquelleAutor der Antwort M-WaJeEh
Möglich, ja. Empfohlen wird? Nein. Wie in der Dokumentation erwähnt:
via: Prozesse und Threads
InformationsquelleAutor der Antwort pablisco