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

11 голосов
/ 27 марта 2011

У меня было такое же неясное сообщение об ошибке и я понятия не имел, почему. Учитывая подсказки из предыдущих ответов, я изменил свои вызовы, не связанные с GUI, на mDialog.finish () на mDialog.dismiss (), и ошибки исчезли. Это не влияло на поведение моего виджета, но сбивало с толку и вполне могло указывать на серьезную утечку памяти.

11 голосов
/ 26 июня 2012

Я получал эти журналы в своем приложении видеоплеера. Эти сообщения были выброшены, когда видео проигрыватель был закрыт. Интересно, что я получал эти журналы один раз за несколько запусков случайным образом. Также мое приложение не включает ни одного progressdialog. Наконец, я обошел эту проблему с помощью реализации ниже.

@Override
protected void onPause()
{
    Log.v("MediaVideo", "onPause");
    super.onPause();
    this.mVideoView.pause();
    this.mVideoView.setVisibility(View.GONE);
}

@Override
protected void onDestroy()
{
    Log.v("MediaVideo", "onDestroy");
    super.onDestroy();
}

@Override
protected void onResume()
{
    Log.v("MediaVideo", "onResume");
    super.onResume();
    this.mVideoView.resume();
}

Переопределите OnPause с вызовом на mVideoView.pause() и набором visibility на GONE. Таким образом я мог решить проблему с ошибкой журнала * Activity has leaked window.

10 голосов
/ 08 августа 2011

У меня возникла та же проблема, и я нашел эту страницу, и хотя моя ситуация отличалась, я вызвал finish из блока if, прежде чем он определил окно предупреждения.

Таким образом, простой вызов dismiss не сработает (поскольку это еще не было сделано), но после прочтения ответа Алексея Волового и понимания того, что это окно предупреждения, вызывает его. Я попытался добавить оператор возврата сразу после финиша внутри этого блока if, и это устранило проблему.

Я думал, что как только ты позвонил финиш, он остановил все и тут же закончил, но это не так. Похоже, что он доходит до конца блока кода, в котором он завершается.

Итак, если вы хотите реализовать ситуацию, в которой иногда он завершается, прежде чем делать какой-то код, вы должны поместить оператор return сразу после завершения или он будет продолжать идти и действовать так, как если бы вызов вызывался в конец блока кода не там, где вы его назвали. Вот почему я получаю все эти странные ошибки.

private picked(File aDirectory){
     if(aDirectory.length()==0){
        setResult(RESULT_CANCELED, new Intent()); 
        finish(); 
        return;
    }
     AlertDialog.Builder alert= new AlertDialog.Builder(this); // Start dialog builder
     alert
        .setTitle("Question")
        .setMessage("Do you want to open that file?"+aDirectory.getName());
    alert
        .setPositiveButton("OK", okButtonListener)
        .setNegativeButton("Cancel", cancelButtonListener);
    alert.show();
}

Если вы не поместите возврат сразу после того, как я вызвал финиш, он будет действовать так, как если бы вы назвали его после alert.show();, и, следовательно, будет сказано, что окно просочилось после финиша сразу после того, как вы сделали Появится диалоговое окно, хотя это не так, но оно все еще думает.

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

7 голосов
/ 09 мая 2016

Это не ответ на вопрос, но он имеет отношение к теме.

Если действие определило атрибут в манифесте

 android:noHistory="true"

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

6 голосов
/ 04 марта 2013

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

Пример:

OldActivity instance;

    oncreate() {
       instance=this;
    }
    instance.finish();
    instance.startActivity(new Intent(ACTION_MAIN).setClass(instance, NewActivity.class));
5 голосов
/ 06 марта 2013

Возникла проблема, когда я закончил Activity, когда еще отображался ProgressDialog.

Итак, сначала скройте диалог, а затем завершите упражнение.

5 голосов
/ 20 июля 2013

Это может быть, если у вас есть ошибка в функции doInBackground() и у вас есть этот код.

Попробуйте, наконец, добавить диалог. Сначала проверьте и исправьте функцию doInBackground()

protected void onPreExecute() {
     super.onPreExecute();
     pDialog = new ProgressDialog(CreateAccount.this);
     pDialog.setMessage("Creating Product..");
     pDialog.setIndeterminate(false);
     pDialog.setCancelable(true);
     pDialog.show();

 }

 protected String doInBackground(String...args) {
     ERROR CAN BE IS HERE
 }

 protected void onPostExecute(String file_url) {
     // dismiss the dialog once done
     pDialog.dismiss();
5 голосов
/ 27 марта 2013

Попробуйте этот код:

public class Sample extends Activity(){
@Override
 public void onCreate(Bundle instance){

}
 @Override
    public void onStop() {
        super.onStop();
      progressdialog.dismiss(); // try this
    }

}
5 голосов
/ 13 августа 2012

Ошибка "Activity has leaked window that was originally added..." возникает при попытке показать предупреждение после того, как Activity эффективно finished.

У вас есть два варианта AFAIK:

  1. Переосмыслите логин вашего оповещения: позвоните dismiss() на dialog, прежде чем фактически завершить свою деятельность.
  2. Поместите dialog в другой поток и запустите его на этом thread (независимо от текущего activity).
5 голосов
/ 19 февраля 2016

Это случилось со мной, когда я использую ProgressDialog в AsyncTask. На самом деле я использую hide() метод в onPostExecute. На основании ответа @Alex Volovoy мне нужно использовать dismiss() с ProgressDialog, чтобы удалить его в onPostExecute и все готово.

progressDialog.hide(); // Don't use it, it gives error

progressDialog.dismiss(); // Use it
...