Was ist dieser Fehler, und warum tritt er auf?
05-17 18:24:57.069: ERROR/WindowManager(18850): Activity com.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850): android.view.WindowLeaked: Activity ccom.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.ViewRoot.<init>(ViewRoot.java:231)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.Window$LocalWindowManager.addView(Window.java:424)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.Dialog.show(Dialog.java:239)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.mypkg.myP$PreparePairingLinkageData.onPreExecute(viewP.java:183)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.os.AsyncTask.execute(AsyncTask.java:391)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.mypkg.myP.onCreate(viewP.java:94)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.access$2200(ActivityThread.java:126)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.os.Handler.dispatchMessage(Handler.java:99)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.os.Looper.loop(Looper.java:123)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.main(ActivityThread.java:4595)
05-17 18:24:57.069: ERROR/WindowManager(18850): at java.lang.reflect.Method.invokeNative(Native Method)
05-17 18:24:57.069: ERROR/WindowManager(18850): at java.lang.reflect.Method.invoke(Method.java:521)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-17 18:24:57.069: ERROR/WindowManager(18850): at dalvik.system.NativeStart.main(Native Method)
Sie versuchen, einen Dialog anzuzeigen, nachdem Sie eine Aktivität beendet haben.
[EDIT]
Diese Frage ist eine der Top-Suchanfragen bei Google für Android-Entwickler, Daher füge ich einige wichtige Punkte aus den Kommentaren hinzu, die für zukünftige Forscher hilfreicher sein könnten, ohne in die Tiefe der Kommentar-Konversation zu gehen.
Antwort 1 :
Sie versuchen, einen Dialog anzuzeigen, nachdem Sie eine Aktivität beendet haben.
Antwort 2
Diese Fehlermeldung kann unter Umständen etwas irreführend sein (obwohl die Antwort immer noch völlig korrekt ist) - d.h. in meinem Fall wurde eine unbehandelte Exception in einer AsyncTask geworfen, was die Aktivität heruntergefahren wurde, dann verursachte ein offener Progressdialog diese Exception... also war die "echte" Exception etwas früher im Log
Antwort 3
Rufen Sie dismiss() für die Dialoginstanz auf, die Sie vor dem Beenden Ihrer Aktivität, z.B. in onPause() oder onDestroy()
Die Lösung ist, dismiss()
auf dem Dialog
aufzurufen, den Sie in viewP.java:183
erstellt haben, bevor Sie die Activity
verlassen, z.B. in onPause()
. Alle Fenster
& Dialoge
sollten geschlossen werden, bevor eine Aktivität
verlassen wird.
Wenn Sie AsyncTask
verwenden, kann diese Log-Meldung trügerisch sein. Wenn Du in Deinem Log nachschaust, könntest Du einen anderen Fehler finden, wahrscheinlich einen in Deiner doInBackground()
Methode Deiner AsyncTask
, der Deine aktuelle Activity
in die Luft jagt, und sobald die AsyncTask
zurückkommt... naja, Du kennst den Rest. Einige andere Benutzer haben das hier schon erklärt :-)