example - toolbar android пример




В результате произошла утечка окна, которое было первоначально добавлено (20)

Была проблема, когда я закончил Activity, когда ProgressDialog все еще показывался.

Поэтому сначала скройте диалоговое окно, а затем завершите операцию.

Какая ошибка, и почему это происходит?

05-17 18:24:57.069: ERROR/WindowManager(18850): Activity com.mypkg.myP has leaked window [email protected] that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850): android.view.WindowLeaked: Activity ccom.mypkg.myP has leaked window [email protected] 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)

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

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

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

Вы должны сделать объект Progressdialog в методе AsyncTask и вы должны dismiss его по методу onPostExecute .


Вы можете получить это исключение просто простой / немой ошибкой, например, при случайном вызове finish() после отображения AlertDialog , если вы пропустите заявление о вызове break в инструкции 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 все еще отображается!

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


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


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

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

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

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

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

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

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

  //Show Your Progress Dialog

}

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

Пример:

OldActivity instance;

    oncreate() {
       instance=this;
    }
    instance.finish();
    instance.startActivity(new Intent(ACTION_MAIN).setClass(instance, NewActivity.class));

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

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

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

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

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

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


Отклонить диалог, когда действие разрушается

@Override
protected void onDestroy()
{
    super.onDestroy();
    if (pDialog!=null && pDialog.isShowing()){
        pDialog.dismiss();
    }
}

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

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

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

}

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

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

                }
            },100);

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


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

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

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

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

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(); и, следовательно, он сказал бы, что окно просочилось, закончив сразу после того, как вы запустили диалог, хотя это не так, все же это так.

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


Эта проблема возникает при попытке показать диалог после того, как вы вышли из Activity.

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

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

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


Это может быть, если у вас есть ошибка в 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();

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

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

 android:noHistory="true"

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


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

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

progressDialog.dismiss(); // Use it

Я получаю эти журналы в приложении для видеопроигрывателя. Эти сообщения были брошены, когда видеопроигрыватель был закрыт. Интересно, что я использовал эти журналы один раз в нескольких сериях случайным образом. Также мое приложение не связано с каким-либо 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 ».


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

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

 try {
        dialog.show();
    } catch (Exception e) {
        dialog.dismiss();
    }




dialog