Frage Die Aktivität hat ein Fenster verloren, das ursprünglich hinzugefügt wurde


Was ist dieser Fehler und warum passiert das?

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)

933
2018-05-17 15:51


Ursprung


Antworten:


Sie versuchen, ein Dialogfeld anzuzeigen, nachdem Sie eine Aktivität beendet haben.

[BEARBEITEN]

Diese Frage ist eine der Top-Suche auf Google für Android-Entwickler, Daher fügen Sie einige wichtige Punkte aus Kommentaren hinzu, die für zukünftige Ermittler hilfreicher sein können, ohne eingehende Kommentaren zu vertiefen.

Antwort 1 :

Sie versuchen, ein Dialogfeld anzuzeigen, nachdem Sie eine Aktivität beendet haben.

Antwort 2 

Dieser Fehler kann unter Umständen etwas irreführend sein (obwohl   die Antwort ist immer noch völlig korrekt) - also in meinem Fall ein   unbehandelt Exception wurde in eine AsyncTask geworfen, die das verursacht hat   Aktivität zum Herunterfahren, dann ein offener Fortschrittdialog verursacht dies   Ausnahme .. also war die "echte" Ausnahme etwas früher im Log

Antwort 3 

Rufen Sie kill () in der Dialog-Instanz auf, die Sie vor dem Beenden von   Aktivität, z.B. in onPause () oder onDestroy ()


1266
2018-05-17 15:54



Die Lösung ist anzurufen dismiss() auf der Dialog Du hast in erstellt viewP.java:183 vor dem Verlassen der Activity, z.B. im onPause(). Alle Windows &Dialogs sollte geschlossen werden, bevor ein Activity.


370
2018-05-17 18:50



Wenn Sie verwenden AsyncTaskWahrscheinlich kann diese Protokollnachricht trügerisch sein. Wenn Sie in Ihrem Protokoll nachschlagen, finden Sie möglicherweise einen anderen Fehler, wahrscheinlich einen in Ihrem doInBackground() Methode deines AsyncTask, das macht deine aktuelle Activity zu sprengen, und damit einmal AsyncTask kommt zurück ... nun, du kennst den Rest. Einige andere Benutzer haben das bereits hier erklärt :-)


100
2017-07-20 18:23



Sie können diese Ausnahme durch einen einfachen / dummen Fehler erhalten, indem Sie (zum Beispiel) versehentlich anrufen finish() nach dem Anzeigen eines AlertDialog, wenn Sie eine Break-Call-Anweisung in einer Switch-Anweisung verpassen ...

   @Override
   public void onClick(View v) {
    switch (v.getId()) {
        case R.id.new_button:
            openMyAlertDialog();
            break; <-- If you forget this the finish() method below 
                       will be called while the dialog is showing!
        case R.id.exit_button:
            finish();
            break;
        }
    }

Das finish() Methode schließt die Activity, aber die AlertDialog wird immer noch angezeigt!

Wenn Sie sich also den Code genau ansehen und nach Problemen mit dem Threading oder nach komplexen Codierungen suchen, sollten Sie den Wald für die Bäume nicht aus den Augen verlieren. Manchmal kann es einfach so einfach und dumm sein wie eine fehlende Break-Anweisung. :)


52
2017-10-08 08:48



Ich habe diesen Fehler ausgelöst, indem ich versehentlich angerufen habe hide() Anstatt von dismiss() auf einem AlertDialog.


48
2017-12-07 19:29



Dieses Problem tritt auf, wenn Sie versuchen, nach dem Beenden einer Aktivität ein Dialogfeld anzuzeigen.

Ich habe dieses Problem nur gelöst, indem ich den folgenden Code aufschrieb:

@Override
public void onDestroy(){
    super.onDestroy();
    if ( progressDialog!=null && progressDialog.isShowing() ){
        progressDialog.cancel();
    }
}

Im Grunde genommen, von welcher Klasse Sie progressDialog gestartet haben, überschreiben Sie die Methode onDestroy und tun dies. Es löste "Aktivität hat durchsickerndes Fenster" Problem.


27
2017-08-30 06:55



Ich bin kürzlich auf dasselbe Problem gestoßen.

Der Grund für dieses Problem ist, dass die Aktivität geschlossen wird, bevor der Dialog geschlossen wird. Es gibt verschiedene Gründe dafür. Die in den obigen Posts erwähnten sind ebenfalls korrekt.

Ich bin in eine Situation geraten, weil im Thread ich eine Funktion genannt habe, die Ausnahme warf. Aufgrund dessen wurde das Fenster geschlossen und damit die Ausnahme.


19
2017-12-08 21:12