просочившееся окно com.android.internal.policy.PhoneWindow $ DecorView {1b2f456 V.E & hellip; R & hellip; D 0,0-684,232}, который был первоначально добавлен здесь [дубликат]

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

func checkPermission() {
        let photoAuthorizationStatus = PHPhotoLibrary.authorizationStatus()
        switch photoAuthorizationStatus {
        case .authorized:
            print("Access is granted by user")
        case .notDetermined:
            PHPhotoLibrary.requestAuthorization({
                (newStatus) in
                print("status is \(newStatus)")
                if newStatus ==  PHAuthorizationStatus.authorized {
                    /* do stuff here */
                    print("success")
                }
            })
            print("It is not determined until now")
        case .restricted:
            // same same
            print("User do not have access to photo album.")
        case .denied:
            // same same
            print("User has denied the permission.")
        }
    }
968
задан MiguelHincapieC 17 September 2015 в 16:38
поделиться

31 ответ

Вы пытаетесь показать диалог после того, как вы вышли из Activity.

[EDIT]

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

Ответ 1:

Вы пытаетесь показать Диалог после того, как вы вышли из Activity.

Ответ 2

В некоторых случаях эта ошибка может немного вводить в заблуждение (хотя ответ по-прежнему полностью точнее), то есть в моем случае в AsyncTask было выбрано необработанное исключение, которое вызвало завершение Activity, тогда открытый прогрессdialog вызвал это исключение .. поэтому «реальное» исключение было немного раньше в журнале

< / blockquote>

Ответ 3

Убрать вызов () в экземпляре Dialog, который вы создали до выхода из своей деятельности, например in onPause () или onDestroy ()

1279
ответ дан Kaze Notus 21 August 2018 в 08:46
поделиться
  if (mActivity != null && !mActivity.isFinishing() && mProgressDialog != null && mProgressDialog.isShowing()) {
        mProgressDialog.dismiss();
    }
1
ответ дан androidmalin 21 August 2018 в 08:46
поделиться

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

 // 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
ответ дан Bapusaheb Shinde 21 August 2018 в 08:46
поделиться

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

100
ответ дан bofredo 21 August 2018 в 08:46
поделиться
  • 1
    Иногда в этом случае я не вижу реального исключения. Чтобы найти реальное исключение, просто закомментируйте progressDialog.show () и запустите приложение снова .. теперь вы его видите. – Stuck 26 August 2012 в 15:42
  • 2

Вы можете получить это исключение просто простой / немой ошибкой, например (случайно), вызвав 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. :) [/ Д2]

372
ответ дан Catalina 21 August 2018 в 08:46
поделиться
  • 1
    Я получаю утечку, когда хочу завершить работу из диалогового окна предупреждения: \ ... – RelativeGames 3 August 2013 в 13:56
  • 2
    Более или менее точно моя проблема. Вызывается завершение в onError после создания диалога, а не в onClick для кнопки увольнения. – jbass 7 March 2017 в 19:55
  • 3
    Поэтому, когда пользователь поворачивает телефон, все диалоги следует отклонить? Это звучит не так. – LarsH 18 August 2017 в 09:52
  • 4
    @LarsH, как вы можете видеть, мой ответ был написан более 7 лет назад, и в то время это было точно так. Я больше не работаю с Android, но, основываясь на том, что я вижу в документации , это может быть все еще так, но с тех пор Android прошел долгий путь (представил Фрагменты, чтобы назвать его), поэтому он теперь, вероятно, проще. – Márton Molnár 16 October 2017 в 07:07

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

try {
        if (null != progressDialog && progressDialog.isShowing()) {
            progressDialog.dismiss();
            progressDialog = null;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
2
ответ дан Developer 21 August 2018 в 08:46
поделиться

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

Пример:

OldActivity instance;

    oncreate() {
       instance=this;
    }
    instance.finish();
    instance.startActivity(new Intent(ACTION_MAIN).setClass(instance, NewActivity.class));
6
ответ дан glennsl 21 August 2018 в 08:46
поделиться

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

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

 android:noHistory="true"

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

7
ответ дан Killer 21 August 2018 в 08:46
поделиться
  • 1
    Можете ли вы связать что-либо подобное для progessdialog.show() .. и progressdialog.hide() в asynctask той же активности, а не onPause() из activity ?? взгляните на мою проблему ... stackoverflow.com/questions/39332880/… – Bhuro 5 September 2016 в 14:39
  • 2
    он отлично работает для меня: андроид: noHistory = & quot; true & quot; – Shohel Rana 28 November 2017 в 12:25

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

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

4
ответ дан LeonS 21 August 2018 в 08:46
поделиться

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

1
ответ дан Manas Ranjan 21 August 2018 в 08:46
поделиться

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

49
ответ дан Mark Phillip 21 August 2018 в 08:46
поделиться
  • 1
    То, что случилось со мной. Кроме того, вызов hide (), а затем установление диалога в значение null также не является допустимой альтернативой. – Lucas Tulio 5 November 2013 в 19:59
  • 2
    то же самое здесь: D ...... – mallaudin 16 July 2017 в 17:52
  • 3
    Я бы действительно знал об этом. Но вызов увольнения () помог мне! – Karoly 29 September 2017 в 20:14

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

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

3
ответ дан Matt Quiros 21 August 2018 в 08:46
поделиться

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

11
ответ дан Melinda Green 21 August 2018 в 08:46
поделиться
  • 1
    Заметил, что я делал mDdialog.hide () перед вызовом finish (). Изменив это для меня, Dialog.dismiss () сделал трюк. – mays 6 July 2011 в 15:37

Отключить диалог, когда действие уничтожает

@Override
protected void onDestroy()
{
    super.onDestroy();
    if (pDialog!=null && pDialog.isShowing()){
        pDialog.dismiss();
    }
}
10
ответ дан Muhammad Aamir Ali 21 August 2018 в 08:46
поделиться
  • 1
    если pDialog равно null, это вызовет ошибку при запросе состояния нулевого диалога – Jon Dunn 20 June 2018 в 15:47

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

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

 try {
        dialog.show();
    } catch (Exception e) {
        dialog.dismiss();
    }
4
ответ дан Ness Tyagi 21 August 2018 в 08:46
поделиться
  • 1
    не будет ли диалоговым окном будет null после того, как он будет завершен?, я думаю, dialog.dismiss() также выдает ошибку – Ashu Kumar 17 August 2018 в 11:25

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

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

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

}
4
ответ дан nickhar 21 August 2018 в 08:46
поделиться
  • 1
    progressdialog.dismiss(); это может создать исключение NullPointerException. – tpk 3 October 2016 в 06:35

У меня такая же проблема. ошибка была не в Dialog, а в EditText. Я пытался изменить значение Edittext внутри Assynctask. единственное, что я мог решить, - это создать новый runnable.

runOnUiThread(new Runnable(){
      @Override
      public void run() {
       ...        
      }
    });  
11
ответ дан rafsanahmad007 21 August 2018 в 08:46
поделиться
  • 1
    я также сталкиваюсь с такой же проблемой. Я добавил эти строки кода в свой код, но он не работал и дает ту же ошибку & quot; android.view.WindowLeaked, которая была первоначально добавлена ​​& quot; а также не воспроизводить видео и выдавать «Видео невозможно воспроизвести». – User42590 11 December 2012 в 09:31

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

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

10
ответ дан Rohit Sharma 21 August 2018 в 08:46
поделиться

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

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

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

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

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

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

11
ответ дан Ruchir Baronia 21 August 2018 в 08:46
поделиться
  • 1
    Не могу поверить, что у него есть только один взлет. Или мы просто плохо работаем над программированием хахаха. Мне также понравилась ваша аналогия с домино – user2161301 15 July 2017 в 21:11
  • 2
    Это была моя проблема. – Scooter 28 April 2018 в 03:55

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

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

progressDialog.dismiss(); // Use it
5
ответ дан SANAT 21 August 2018 в 08:46
поделиться
  • 1
    На самом деле это не полный ответ. Существует два способа утечки диалогового окна. 1) Если у вас есть AsyncTask, и вы показываете Dialog, то происходит что-то, что делает вызов Activity onPause() (может быть, какая-то логика в вашей AsyncTask сама, как слушатель, тогда она просачивается). 2) Как уже упоминалось выше, Dialog, который был создан с этим Activity Context, никогда не отклоняется, а Activity движется дальше. – tricknology 21 October 2017 в 08:36

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

if (! isFinishing()) {

    dialog.show();

    }
9
ответ дан sandy 21 August 2018 в 08:46
поделиться
  • 1
    Среди сотен подобных ответов никто не показывает, как проверить, существуют ли окна. Поэтому вы спасли меня некоторое время, чтобы найти способ сделать это. Благодарю. – kolyaseg 21 October 2015 в 07:40

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

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

                }
            },100);
1
ответ дан Satish Silveri 21 August 2018 в 08:46
поделиться

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

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

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

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

@Override
public void onDestroy(){
    super.onDestroy();
    if ( Dialog!=null && Dialog.isShowing() ){
        Dialog.dismiss();
}
}
1
ответ дан Sherry 21 August 2018 в 08:46
поделиться

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

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

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

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

27
ответ дан Stephan 21 August 2018 в 08:46
поделиться
  • 1
    onDestroy не гарантируется. Лучше поставить этот код в onPause или onStop – Amruta-Pani 17 December 2017 в 17:53

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

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

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

19
ответ дан Tushar 21 August 2018 в 08:46
поделиться

Это может быть, если у вас есть ошибка в функции 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
ответ дан Tushar Gupta 21 August 2018 в 08:46
поделиться

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

372
ответ дан Catalina 21 August 2018 в 08:46
поделиться
  • 1
    Поэтому, когда пользователь поворачивает телефон, все диалоги следует отклонить? Это звучит не так. – LarsH 18 August 2017 в 09:52
  • 2
    @LarsH, как вы можете видеть, мой ответ был написан более 7 лет назад, и в то время это было точно так. Я больше не работаю с Android, но, основываясь на том, что я вижу в документации , это может быть все еще так, но с тех пор Android прошел долгий путь (представил Фрагменты, чтобы назвать его), поэтому он теперь, вероятно, проще. – Márton Molnár 16 October 2017 в 07:07

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

11
ответ дан rafsanahmad007 21 August 2018 в 08:46
поделиться
  • 1
    я также сталкиваюсь с такой же проблемой. Я добавил эти строки кода в свой код, но он не работал и дает ту же ошибку & quot; android.view.WindowLeaked, которая была первоначально добавлена ​​& quot; а также не воспроизводить видео и выдавать «Видео невозможно воспроизвести». – User42590 11 December 2012 в 09:31
2
ответ дан Ali Akram 1 November 2018 в 03:26
поделиться
11
ответ дан rafsanahmad007 1 November 2018 в 03:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: