Активность просочилась окно, которое было первоначально добавлено - 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 ]

1438 голосов
/ 17 мая 2010

Вы пытаетесь показать диалог после выхода из действия.

[EDIT]

Этот вопрос является одним из самых популярных в Google для разработчиков Android. поэтому добавив несколько важных моментов из комментариев, которые могут оказаться более полезными для будущего исследователя, не вдаваясь в подробности обсуждения комментариев.

Ответ 1 :

Вы пытаетесь показать диалог после выхода из действия.

Ответ 2

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

Ответ 3

Вызовите dismiss () для экземпляра Dialog, который вы создали до выхода из вашего Деятельность, например в onPause () или onDestroy ()

385 голосов
/ 17 мая 2010

Решение состоит в том, чтобы вызвать dismiss() на Dialog, который вы создали в viewP.java:183 перед выходом из Activity, например, в onPause(). Все Window s & Dialog s должны быть закрыты перед выходом из Activity.

106 голосов
/ 20 июля 2010

Если вы используете AsyncTask, возможно, это сообщение журнала может быть обманчивым. Если вы посмотрите в своем журнале, вы можете найти другую ошибку, вероятно, в вашем doInBackground() методе вашего AsyncTask, которая заставляет ваш текущий Activity взорваться, и, таким образом, когда AsyncTask возвращается. Ну, ты знаешь остальное. Некоторые другие пользователи уже объяснили это здесь: -)

61 голосов
/ 07 декабря 2011

Я вызвал эту ошибку, по ошибке позвонив hide() вместо dismiss() на AlertDialog.

54 голосов
/ 08 октября 2010

Вы можете получить это исключение просто / тупой ошибкой, например, случайно вызвав finish() после отображения AlertDialog, если вы пропустите оператор вызова прерывания в операторе switch ...

   @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;
        }
    }

Метод finish() закрывает Activity, но AlertDialog по-прежнему отображается!

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

31 голосов
/ 30 августа 2012

Эта проблема возникает при попытке показать диалог после выхода из действия.

Я только что решил эту проблему, записав следующий код:

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

По сути, из какого класса вы начали progressDialog, переопределите метод onDestroy и сделайте так. Решена проблема «Активность вытекла из окна».

27 голосов
/ 27 июня 2017

Все ответы на этот вопрос были правильными, но я немного сбивался с толку, чтобы понять, почему. После игры в течение примерно 2 часов причина этой ошибки (в моем случае) меня ударила:

Вы уже знаете, прочитав другие ответы, что ошибка имеет X has leaked window DecorView@d9e6131[] означает, что диалоговое окно было открыто при закрытии приложения. Но почему?

Возможно, что ваше приложение зависло по какой-то другой причине, когда ваш диалог был открыт

Это приводит к закрытию вашего приложения из-за некоторой ошибки в вашем коде, которая приводит к тому, что диалоговое окно остается открытым одновременно с закрытием вашего приложения из-за другой ошибки.

Итак, просмотрите свою логику. Решите первую ошибку, и тогда вторая ошибка сама решит enter image description here

Одна ошибка вызывает другую, которая вызывает другую, как DOMINOS!

19 голосов
/ 09 декабря 2011

Я недавно столкнулся с той же проблемой.

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

Я попал в ситуацию, потому что в потоке я вызывал функцию, которая выдавала исключение. Из-за чего окно было закрыто и, следовательно, исключение.

13 голосов
/ 27 июня 2013

Закрыть диалоговое окно, когда активность уничтожена.

@Override
protected void onDestroy()
{
    super.onDestroy();
    if (pDialog!=null && pDialog.isShowing()){
        pDialog.dismiss();
    }
}
13 голосов
/ 26 апреля 2013

Это может помочь.

if (! isFinishing()) {

    dialog.show();

    }
...