Активность просочилась окно, которое было первоначально добавлено - PullRequest
1074 голосов
/ 17 мая 2010

Что это за ошибка и почему она происходит?

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)

Ответы [ 39 ]

4 голосов
/ 15 сентября 2017

Обычно эта проблема возникает из-за диалогового окна прогресса: вы можете решить эту проблему, используя любой из следующих методов в вашей деятельности:

 // 1):
          @Override
                protected void onPause() {
                    super.onPause();
                    if ( yourProgressDialog!=null && yourProgressDialog.isShowing() )
                  {
                        yourProgressDialog.cancel();
                    }
                }

       // 2) :
         @Override
            protected void onDestroy() {
                super.onDestroy();
                if ( yourProgressDialog!=null && yourProgressDialog.isShowing()
               {
                    yourProgressDialog.cancel();
                }
            }
4 голосов
/ 24 мая 2013

Вы должны сделать Progressdialog объект в onPreExecute методе AsyncTask, и вы должны dismiss это метод onPostExecute

3 голосов
/ 08 сентября 2012

В моем случае причина была в том, что я забыл включить разрешение в файл манифеста Android.

Как я узнал? Ну, точно так же, как @Bobby говорит в комментарии под принятым ответом, просто прокрутите дальше до своих журналов, и вы увидите первую причину или событие, которое действительно вызвало исключение. По-видимому, сообщение «Активность просочилось окно, которое было первоначально добавлено», является только Исключением, которое является результатом того, что является первым Исключением.

3 голосов
/ 01 ноября 2017

Лучшее решение - просто добавить диалог в диалоге try catch и dismiss при возникновении исключения

Просто используйте ниже код

 try {
        dialog.show();
    } catch (Exception e) {
        dialog.dismiss();
    }
2 голосов
/ 17 сентября 2015

Исключения утечки в окне имеют две причины:

1) показ диалогового окна, когда контекст активности не существует, для решения этой проблемы вы должны показать диалог, только если вы уверены, что активность существует:

if(getActivity()!= null && !getActivity().isFinishing()){
        Dialog.show();
}

2) не закрыть диалоговое окно соответствующим образом, для решения используйте этот код:

@Override
public void onDestroy(){
    super.onDestroy();
    if ( Dialog!=null && Dialog.isShowing() ){
        Dialog.dismiss();
}
}
2 голосов
/ 29 июня 2018

Лучшее решение это поставить перед показом progressbar или progressDialog

if (getApplicationContext().getWindow().getDecorView().isShown()) {

  //Show Your Progress Dialog

}
2 голосов
/ 14 февраля 2014

Попробуйте приведенный ниже код, он будет работать каждый раз, когда вы будете закрывать диалог прогресса, и он будет видеть, доступен ли его экземпляр.

try {
        if (null != progressDialog && progressDialog.isShowing()) {
            progressDialog.dismiss();
            progressDialog = null;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
1 голос
/ 27 июня 2016
  if (mActivity != null && !mActivity.isFinishing() && mProgressDialog != null && mProgressDialog.isShowing()) {
        mProgressDialog.dismiss();
    }
1 голос
/ 16 декабря 2013

Просто убедитесь, что ваша активность неожиданно не закрывается из-за некоторых исключений, возникающих где-то в вашем коде. Обычно это происходит в асинхронной задаче, когда действие сталкивается с принудительным закрытием в методе doinBackground, а затем asynctask возвращается к методу onPostexecute.

1 голос
/ 08 декабря 2016

Проблема, по моему мнению, заключается в том, что вы пытаетесь вызвать диалоговое окно сразу после завершения действия, поэтому, по моему мнению, вы можете дать некоторую задержку с помощью обработчика, и ваша проблема будет решена, например:

 Handler handler=new Handler();
     handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                     dialog.show();
                     //or
                     dialog.dismiss();

                }
            },100);
...