Ich habe einige der folgenden Ausnahmen:
java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:355)
at android.view.WindowManagerImpl.updateViewLayout(WindowManagerImpl.java:191)
at android.view.Window$LocalWindowManager.updateViewLayout(Window.java:428)
at android.app.Dialog.onWindowAttributesChanged(Dialog.java:596)
at android.view.Window.setDefaultWindowFormat(Window.java:1013)
at com.android.internal.policy.impl.PhoneWindow.access$700(PhoneWindow.java:86)
at com.android.internal.policy.impl.PhoneWindow$DecorView.drawableChanged(PhoneWindow.java:1951)
at com.android.internal.policy.impl.PhoneWindow$DecorView.fitSystemWindows(PhoneWindow.java:1889)
at android.view.ViewRoot.performTraversals(ViewRoot.java:727)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4338)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
Ich habe es gegoogelt und festgestellt, dass es etwas mit Popups und dem Drehen des Bildschirms zu tun hat, aber es gibt keinen Verweis auf meinen Code.
Die Fragen sind:
- Gibt es eine Möglichkeit, genau herauszufinden, wann dieses Problem auftritt?
- Gibt es außer dem Drehen des Bildschirms ein anderes Ereignis oder eine andere Aktion, die diesen Fehler auslöst?
- Wie verhindere ich dies?
View#onAttachedToWindow()
sie aufgerufen wurde?Antworten:
Ich hatte dieses Problem, bei dem bei einer Änderung der Bildschirmausrichtung die Aktivität vor der AsyncTask beendet wurde und der Fortschrittsdialog abgeschlossen wurde. Ich schien dies zu beheben, indem ich den Dialog auf null setzte
onPause()
und dies dann in der AsyncTask überprüfte, bevor ich ihn schloss.... in meiner AsyncTask:
quelle
Nach einem Kampf mit diesem Problem habe ich endlich diese Problemumgehung:
Manchmal funktioniert eine gute Ausnahmebehandlung gut, wenn es keine bessere Lösung für dieses Problem gibt.
quelle
Wenn ein
Activity
Objekt herumhängt, können Sie die folgendeisDestroyed()
Methode verwenden:Dies ist hilfreich, wenn Sie eine nicht anonyme
AsyncTask
Unterklasse haben, die Sie an verschiedenen Orten verwenden.quelle
Ich verwende eine benutzerdefinierte statische Klasse, die einen Dialog ein- und ausblendet. Diese Klasse wird auch von anderen Aktivitäten verwendet, nicht nur von einer Aktivität. Nun erschien mir auch das von Ihnen beschriebene Problem und ich blieb über Nacht, um eine Lösung zu finden.
Zum Schluss präsentiere ich Ihnen die Lösung!
Wenn Sie einen Dialog anzeigen oder schließen möchten und nicht wissen, welche Aktivität den Dialog initiiert hat, um ihn zu berühren, ist der folgende Code für Sie.
quelle
Die obige Lösung hat bei mir nicht funktioniert. Also habe ich
ProgressDialog
als global genommen und dies dann zu meiner Aktivität hinzugefügtWenn also die Aktivität zerstört wird, wird auch der ProgressDialog zerstört.
quelle
Zu Frage 1):
Da die Fehlermeldung nicht zu sagen scheint, welche Zeile Ihres Codes das Problem verursacht, können Sie sie mithilfe von Haltepunkten aufspüren. Haltepunkte unterbrechen die Ausführung des Programms, wenn das Programm bestimmte Codezeilen erreicht. Durch Hinzufügen von Haltepunkten an kritischen Stellen können Sie bestimmen, welche Codezeile den Absturz verursacht. Wenn Ihr Programm beispielsweise in einer Zeile setContentView () abstürzt, können Sie dort einen Haltepunkt setzen. Wenn das Programm ausgeführt wird, wird es angehalten, bevor diese Zeile ausgeführt wird. Wenn das Programm nach dem Fortsetzen vor dem Erreichen des nächsten Haltepunkts abstürzt, wissen Sie, dass sich die Linie, die das Programm beendet hat, zwischen den beiden Haltepunkten befand.
Das Hinzufügen von Haltepunkten ist einfach, wenn Sie Eclipse verwenden. Klicken Sie mit der rechten Maustaste in den Rand links neben Ihrem Code und wählen Sie "Haltepunkt umschalten". Anschließend müssen Sie Ihre Anwendung im Debug-Modus ausführen, der Schaltfläche, die wie ein grünes Insekt neben der normalen Ausführungsschaltfläche aussieht. Wenn das Programm einen Haltepunkt erreicht, wechselt Eclipse in die Debug-Perspektive und zeigt Ihnen die Zeile an, auf die es wartet. Um das Programm erneut zu starten, suchen Sie nach der Schaltfläche "Fortsetzen", die wie eine normale "Wiedergabe" aussieht, jedoch einen vertikalen Balken links vom Dreieck aufweist.
Sie können Ihre Anwendung auch mit Log.d ("Meine Anwendung", "Einige Informationen hier, aus denen hervorgeht, wo sich die Protokollzeile befindet") füllen, das dann Nachrichten im LogCat-Fenster von Eclipse veröffentlicht. Wenn Sie dieses Fenster nicht finden können, öffnen Sie es mit Fenster -> Ansicht anzeigen -> Andere ... -> Android -> LogCat.
Hoffentlich hilft das!
quelle
Ich habe dem Manifest für diese Aktivität Folgendes hinzugefügt
quelle
Gemäß dem Code des windowManager (Link hier ) tritt dies auf, wenn die Ansicht, die Sie aktualisieren möchten ( die wahrscheinlich zu einem Dialogfeld gehört, aber nicht erforderlich ist), nicht mehr an das eigentliche Stammverzeichnis der Fenster angehängt ist.
Wie andere vorgeschlagen haben, sollten Sie den Status der Aktivität überprüfen, bevor Sie spezielle Vorgänge in Ihren Dialogen ausführen.
Hier ist der relavante Code, der die Ursache für das Problem ist (kopiert aus dem Android-Quellcode):
quelle
Mein Problem wurde gelöst, indem die Bildschirmdrehung auf meinem Android-Gerät blockiert wurde. Die App, die mir ein Problem verursachte, funktioniert jetzt einwandfrei
quelle
Eine andere Option besteht darin, die asynchrone Aufgabe erst zu starten, wenn der Dialog an das Fenster angehängt ist, indem onAttachedToWindow () im Dialog überschrieben wird. Auf diese Weise kann er immer geschlossen werden.
quelle
Oder einfach können Sie hinzufügen
das macht das
ProgressDialog
nicht stornierbarquelle
Warum nicht versuchen, so zu fangen:
quelle
Wenn Sie Aktivität im Manifest deklarieren, benötigen Sie Android: configChanges = "Orientierung"
Beispiel:
quelle