Etkinlik, başlangıçta eklenen pencereyi sızdırdı


1162

Bu hata nedir ve neden oluyor?

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)

6
Diğer klasik ise oryantasyon değiştiğinde: stackoverflow.com/questions/1111980/…
rds

Yanıtlar:


1560

Bir Etkinlikten çıktıktan sonra bir İletişim Kutusu göstermeye çalışıyorsunuz.

[DÜZENLE]

Bu soru, android geliştiricisi için google'da en iyi aramalardan biridir, bu nedenle yorumlardan birkaç önemli nokta ekleyerek, yorum konuşmalarının derinliklerine girmeden gelecekteki araştırmacı için daha yararlı olabilir.

Cevap 1 :

Bir Etkinlikten çıktıktan sonra bir İletişim Kutusu göstermeye çalışıyorsunuz.

Cevap 2

Bu hata bazı durumlarda biraz yanıltıcı olabilir (cevap hala tam olarak doğru olsa da) - yani benim durumumda bir AsyncTask'ta işlenmemiş bir İstisna atıldı, bu da Aktivitenin kapanmasına neden oldu, o zaman açık bir progressdialog bu İstisnaya neden oldu. günlükte 'gerçek' istisna biraz daha erkendi

Cevap 3

Etkinliğinizden çıkmadan önce oluşturduğunuz İletişim Kutusu örneğinde dismiss () öğesini çağırın, örneğin onPause () veya onDestroy ()


2
@ Public void'i geçersiz kılın onStop () {if (dialog! = Null) {dialog.dismiss (); dialog = null; }}
Md.Tarikul İslam

14
8 yıl sonra bile bu hala geçerli! Benim AlertDialog (yani Cevap 2) görüntülemeye çalışırken etkinlik kapatıldığı için istisna aldım. Sonunda uygulamanın sahneye "boş" bir nesne eklediğini öğrendim (olmamalıydı ama oldu) ama bunun için ekstra bir istisna vermedi ve her şey "sızdırılmış" window "özel durumu yerine.
Nefis

Tüm açık iletişim kutularını taramak ve hepsini onStop () içinde kapatmak mümkün müdür? Öğeleri tıklarken ListView içinde iletişim kutuları oluştururum. OnStop referanslarını almak için nasıl emin değilim.
Myoch

1
Cevap 3 en iyi çözümdür. benim için çok çalıştı. Teşekkürler kaze, Alex !!
amit bansode

iletişim kutusunu bir döngüde görüntülüyorsanız ek ipucu etkinlik bittikten sonra döngüden çıkıldığından emin olun
Thecarisma

406

Çözelti çağrısına olduğu dismiss()üzerinde Dialogoluşturduğunuz viewP.java:183çıkmadan önce Activityörneğin içinde, onPause(). Tüm Windows & Dialogs ayrılmadan önce kapalı olmalıdır Activity.


3
Böylece kullanıcı telefonu döndürdüğünde, tüm iletişim kutuları kapatılmalıdır ?? Kulağa doğru gelmiyor.
LarsH

@LarsH gördüğünüz gibi, cevabım 7 yıldan fazla bir süre önce yazılmıştı ve bu o zamanlar kesinlikle doğruydu. Artık Android ile çalışmıyorum, ancak belgelerde gördüklerime dayanarak, yine de durum böyle olabilir, ancak Android uzun bir yol kat etti (Parçalar sadece birini adlandırmak için tanıtıldı), bu yüzden şimdi daha kolay.
molnarm

108

Kullanıyorsanız AsyncTask, muhtemelen bu günlük iletisi aldatıcı olabilir. Eğer günlüğünüze bakarsanız, muhtemelen sizin doInBackground()metodunuzda bir tane daha bulabilirsiniz AsyncTask, bu da akımınızı Activitypatlatır ve böylece AsyncTaskgeri geldiğinde .. gerisini biliyorsunuz. Diğer bazı kullanıcılar burada zaten açıkladı :-)


22
Bazen bu durumda gerçek istisnayı göremiyorum. Gerçek istisnayı bulmak için sadece progressDialog.show () 'u yorumlayın ve uygulamayı tekrar çalıştırın .. şimdi görüyorsunuz.
Stuck

Merhaba millet! Yukarıda @Stuck tarafından belirtildiği gibi, gerçek istisnayı da göremiyorum, Ne yaptım? Kırarak noktaları kullanılarak izlenir ve I yöntem içinde, bir uygulama sınıfının bir referans kullanılarak keşfetti doInBackgroundarasında AsyncTaskbunun sınıfı, ancak açıklamadan olmadan AndroidManifestözelliğini kullanarak dosya android:nameörneğin: android:name="my.package.MyApplicationClass". Kullanırken iyi bir uygulama AsyncTask, uyarıyı her zaman yöntemin içinde başlatmayı onPreExecuteve kapatmayı unutmayın onPostExecute.
GFPF

66

Ben yanlışlıkla arayarak bu hatayı tetikleyen hide()yerine dismiss()bir üzerinde AlertDialog.


4
Tam olarak bana ne oldu. Ayrıca, hide () öğesini çağırıp iletişim kutusunu null değerine ayarlamak da geçerli bir alternatif değildir.
Lucas Tulio

Bunun arkasındaki konuyu gerçekten biliyordum. Ama dismiss () çağrısı bana yardımcı oldu!
Karoly

59

Bir anahtar deyiminde bir kesme çağrısı ifadesini kaçırırsanız, bu istisnayı basit / aptal bir hata ile (örneğin) finish()bir görüntüledikten sonra yanlışlıkla arayarak alabilirsiniz AlertDialog...

   @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()Yöntem kapanacak Activity, ama AlertDialogyine de görüntülüyor!

Bu nedenle, koda dikkatle bakarken, kötü iş parçacığı sorunları veya karmaşık kodlama ve benzeri şeyler ararken, ağaçlar için ormanı gözden kaçırmayın. Bazen eksik bir mola ifadesi kadar basit ve aptalca bir şey olabilir. :)


Sorunum az çok. İletişim kutusu oluşturulduktan sonra onError'da bitir olarak adlandırıldı, reddetme düğmesi için onClick'te değil.
jbass

46

Bu sorunun cevapları doğruydu, ama aslında nedenini anlamak benim için biraz kafa karıştırıcı. Yaklaşık 2 saat oynadıktan sonra bu hatanın nedeni (benim durumumda) bana çarptı:

Zaten, diğer yanıtları okurken X has leaked window DecorView@d9e6131[]hata olduğunu, uygulamanız kapatıldığında bir iletişim kutusunun açık olduğu anlamına gelir. Ama neden?

Diyalogunuz açıkken uygulamanız başka bir nedenden dolayı çökmüş olabilir

Bu, uygulamanızın diğer hata nedeniyle kapatıldığı sırada iletişim kutusunun açık kalmasına neden olan kodunuzdaki bir hata nedeniyle uygulamanızın kapanmasına neden olur.

Yani, mantığınıza bakın. İlk hatayı çöz, sonra ikinci hata kendini çözerresim açıklamasını buraya girin

Bir hata diğerine, DOMINOS gibi başka bir hataya neden olur!


2
Bunun sadece bir yukarı oyu olduğuna inanamıyorum .. ya da programlama konusunda gerçekten kötüyüz hahaha Domino benzetmenizi da beğendim
user2161301

İlk hatayı çözün, ikinci hata oluşmaz . Bu benzetme bana yardımcı oldu.
itabdullah

Bu tamamen doğru değil, telefonun döndürülmesi gibi durumlar da "etkinlik" dönüşünün gerçekleşmesine neden olabilir.
Sreekanth Karumanaghat

36

Bu sorun, bir Etkinlikten çıktıktan sonra bir İletişim Kutusu göstermeye çalışırken ortaya çıkar.

Ben sadece aşağıdaki kodu yazarak bu sorunu çözdüm:

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

Temel olarak, hangi sınıftan progressDialog'u başlattığınız, onDestroy yöntemini geçersiz kılın ve bu şekilde yapın. "Etkinlik pencereyi sızdırdı" sorununu çözdü.


onDestroy'un aranacağı garanti edilmez. Bu kodu onPause veya onStop'a koymak daha iyi
Amruta-Pani

19

Geçenlerde aynı sorunla karşılaştım.

Bu sorunun arkasındaki neden, iletişim kutusunun kapatılmasından önce etkinliğin kapatılmasıdır. Yukarıdakilerin gerçekleşmesinin çeşitli nedenleri vardır. Yukarıdaki yazılarda belirtilenler de doğrudur.

Bir duruma girdim, çünkü iş parçacığında, istisna atan bir işlev çağırıyordum. Bu nedenle pencere kapatıldı ve bu nedenle istisna.


16

Etkinlik yok edildiğinde iletişim kutusunu kapat

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

pDialog null ise, null iletişim kutusunun durumunu sorgularken bir hata atar
Jonathan Dunn

1
hayır @JonDunn olmayacak, çünkü ilki yanlışsa Java ikinci
boole'i ​​işlemeyecektir

13

Bu yardımcı olabilir.

if (! isFinishing()) {

    dialog.show();

    }

2
Benzer yüzlerce cevap arasında, pencerelerin var olup olmadığını nasıl kontrol edeceğinizi gösteren kimse yok. Yani bana bunu yapmanın yolunu bulmak için biraz zaman kazandırıyorsun. Teşekkürler.
kolyaseg

11

Aynı belirsiz hata mesajını aldım ve neden olduğu hakkında hiçbir fikrim yoktu. Önceki yanıtlardan ipuçları verildiğinde, GUI olmayan çağrılarımı mDialog.finish () olarak mDialog.dismiss () olarak değiştirdim ve hatalar kayboldu. Bu, widget'ımın davranışını etkilemedi, ancak rahatsız edici ve önemli bir bellek sızıntısını işaretliyor olabilirdi.


Finish () çağrısından önce bir mDialog.hide () yaptığımı fark ettim. Bunu mDialog.dismiss () olarak değiştirmek hile yaptı.
mays

11

Bu günlükleri video oynatıcı uygulamamda alıyordum. Bu mesajlar video oynatıcı kapalıyken atılır. İlginç bir şekilde, bu günlükleri birkaç kez rastgele bir şekilde alırdım. Ayrıca benim uygulama herhangi bir dahil değildir progressdialog. Son olarak, aşağıdaki uygulama ile bu sorunu çözdüm.

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

Geçersiz Kıl OnPauseiçin çağrı ile mVideoView.pause()ve sette visibilityiçin GONE. Bu şekilde " Activity has leaked window" günlük hatası sorununu çözebilirim .


Ben de aynı sorunla karşı karşıyayım. kodumda bu kod satırlarını ekledi ama işe yaramadı ve aynı hatayı verir "android.view.WindowLeaked aslında eklendi" ve ayrıca video
oynatmaz

10

Aynı sorunu yaşıyordum ve bu sayfayı buldum ve durumum farklı olsa da, uyarı kutusunu tanımlamadan önce finishbir ifbloktan aradım .

Yani, sadece aramak (dismiss henüz yapılmadığı gibi) işe yaramaz, ancak Alex Volovoy'un cevabını okuduktan ve fark ettikten sonra buna neden olan uyarı kutusu oldu. Bu ifblok içinde bitirdikten hemen sonra bir dönüş ifadesi eklemeye çalıştım ve bu sorunu düzeltti.

Bitir dedikten sonra her şeyi durdurup orada bitirdiğini düşündüm, ama bitmedi. İçinde bulunduğu kod bloğunun sonuna gidiyor gibi görünüyor.

Bu nedenle, bazen bazı kodları yapmadan önce biteceği bir durumu uygulamak istiyorsanız, bitirdikten hemen sonra bir iade ifadesi koymanız gerekir veya devam eder ve bitişin çağrıldığı gibi hareket eder. kod bloğu aradığınız yerde değil. Bu yüzden bütün bu tuhaf hataları alıyordum.

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();
}

Eğer orada bitir çağırdıktan hemen sonra dönüşü koymazsanız, sonradan çağırmışsınız gibi davranacaktır alert.show();ve bu nedenle, iletişim kutusu görüntülendikten hemen sonra pencerenin bitirilerek sızdırıldığını söyleyecektir. durum böyle değil, hala öyle olduğunu düşünüyorum.

Bunu buraya ekleyeceğimi sanıyordum, çünkü bu bitiş komutunun farklı davrandığını gösteriyor, sonra düşündüm ve bunu keşfetmeden önce aynı şeyi düşünen başka insanlar var sanırım.


7

Bu sorunun cevabı değil, konuyla ilgili.

Etkinlik, Manifest'te bir özellik tanımladıysa

 android:noHistory="true"

onPause () çalıştırıldıktan sonra, etkinlik içeriği kaybolur. Yani tüm görünüm bu bağlamı kullanıyor bu hata verebilir.


Eğer benzer bir şey ilgilidir Can progessdialog.show().. ve progressdialog.hide()de asynctaskaynı faaliyetin yerine onPause()gelen activity?? benim
sorunuma

1
benim için mükemmel çalışıyor: android: noHistory = "true"
Shohel Rana

6

Yalnızca bir uyarı göstermeye çalışmakla kalmaz, aynı zamanda belirli bir etkinlik örneğini bitirip yeni etkinlik / hizmet başlatmaya veya durdurmaya çalıştığınızda da çağrılabilir.

Misal:

OldActivity instance;

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

6

Genellikle bu sorun ilerleme iletişim kutusu nedeniyle oluşur: bunu etkinliğinizde aşağıdaki yöntemlerden birini kullanarak çözebilirsiniz:

 // 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();
                }
            }

5

Bir ProgressDialog hala gösterildiğinde bir Etkinliği bitirdiğimde sorun yaşadım.

Bu yüzden önce İletişim Kutusunu gizleyin ve ardından etkinliği tamamlayın.


5

Bu kodu deneyin:

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

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

}

progressdialog.dismiss();bu NullPointerException oluşturabilir.
tpk

5

Bu doInBackground()işlevde bir hata varsa ve bu kodu varsa olabilir.

Sonunda iletişim kutusu eklemeyi deneyin. İlk önce kontrol ve düzeltme doInBackground()fonksiyonu

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

Bunu kullanırken benim başıma ProgressDialoggeldi AsyncTask. Aslında ben hide()yöntem kullanıyorum onPostExecute. @Alex Volovoy cevabı dayanarak i kullanmak gerekmez dismiss()ile ProgressDialogOnPostExecute ve yapılması halinde çıkarmak için.

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

progressDialog.dismiss(); // Use it

Bu tam cevap değil. Bir iletişim kutusunu sızdırmanın iki yolu vardır. 1) Eğer varsa AsyncTaskve gösterirseniz Dialog, o zaman Activityçağrıyı yapan bir şey olur onPause()(belki bir dinleyici gibi AsyncTask'ınızda bir mantık, o zaman sızıntı yapar. 2) Yukarıda belirtildiği gibi, Dialogbununla yaratılan Activity Contextasla işten atılır ve Activityhareketler devam eder.
tricknology

5

Etkin etkin Activity has leaked window that was originally added...olduktan sonra bir uyarı göstermeye çalıştığınızda " " hatası oluşuyor .Activityfinished

İki seçeneğiniz var AFAIK:

  1. Senin uyarının giriş yeniden düşünün: çağrı dismiss()üzerine dialoggerçekte aktiviteyi çıkmadan önce.
  2. dialogFarklı bir iş parçacığına koyun ve üzerinde çalıştırın thread(akımdan bağımsız olarak activity).

5

AlertDialog'u kapatmak istediğinizde ancak etkinliğin içinde bir referans tutmak istemediğinizde bir çözümdür .

çözüm , projenizde androidx.lifecycle bağımlılığına sahip olmanızı gerektirir (yorumun şu anda ortak bir gereklilik olduğuna inanıyorum)

Bu, iletişim kutusunun görevden alınmasını harici nesneye (gözlemci) devredebilmenizi sağlar ve artık bununla ilgilenmeniz gerekmez, çünkü etkinlik sona erdiğinde otomatik olarak abonelikten çıkarılır. (işte kanıt: https://github.com/googlecodelabs/android-lifecycles/issues/5 ).

bu nedenle, gözlemci diyalog referansını tutar ve etkinlik gözlemciye referans tutar. "onPause" olduğunda - gözlemci iletişim kutusunu kapatır ve "onDestroy" gerçekleştiğinde - etkinlik gözlemciyi kaldırır, böylece sızıntı olmaz (en azından logcat'te artık hata görmüyorum)

// observer
class DialogDismissLifecycleObserver( private var dialog: AlertDialog? ) : LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun onPause() {
        dialog?.dismiss()
        dialog = null
    }
}
// activity code
private fun showDialog() {
        if( isDestroyed || isFinishing ) return
        val dialog = AlertDialog
            .Builder(this, R.style.DialogTheme)
            // dialog setup skipped
            .create()
        lifecycle.addObserver( DialogDismissLifecycleObserver( dialog ) )
        dialog.show()
}

4

Pencere sızdırması istisnalarının iki nedeni vardır:

1) Etkinlik Bağlamı olmadığında iletişim kutusunu gösterir, bunu çözmek için iletişim kutusunun yalnızca Etkinlik olduğundan emin olduğunuzdan emin olmalısınız:

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

2) bu kodu kullanarak çözmek için iletişim kutusunu uygun şekilde reddetmeyin:

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

4

Yöntemde Progressdialognesne yapmak zorundasınız ve onPreExecuteyöntem üzerinde AsyncTaskyapmalısınız .dismissonPostExecute


4

En iyi çözüm, istisna oluştuğunda yakala ve kapat iletişim kutusunu dene iletişim kutusu eklemektir.

Sadece aşağıdaki kodu kullanın

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

3
? bittikten denilen sonra boş olacak iletişim değildir, bence dialog.dismiss()çok hata üretecektir
Ashu Kumar

3

Benim durumumda, Android manifest dosyasına bir izin eklemeyi unuttum.

Nasıl öğrendim? @Bobby'nin kabul edilen cevabın altındaki bir yorumda söylediği gibi, günlüklerinize kadar ilerleyin ve İstisna'yı gerçekten atan ilk neden veya olayı göreceksiniz. Görünüşe göre, "Aktivite başlangıçta eklenen pencere sızdırılmış" mesajı sadece ilk İstisna ne olursa olsun bir İstisna'dır.


3

Aşağıdaki kodu deneyin, ilerleme diyaloğunu her zaman kapatacağınız zaman çalışacak ve örneğinin kullanılabilir olup olmadığını görecektir.

try {
        if (null != progressDialog && progressDialog.isShowing()) {
            progressDialog.dismiss();
            progressDialog = null;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

2

En iyi çözüm bunu göstermeden önce koymak progressbarveyaprogressDialog

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

  //Show Your Progress Dialog

}

Bu benim için işe yaramıyor. HTTP çağrısından yanıttan sonra Dialog.show () var ve bu arada ekran döndürdüğümde Etkinlik müstakil ama Dialog.show () önce isShown == true gibi görünüyor ve sonra Dialog bu kontrole rağmen çöküyor
Michał Ziobro

1

Kodunuzda bir yerde yapılan bazı istisnalar nedeniyle etkinliğinizin beklenmedik bir şekilde kapanmadığından emin olun. Genellikle etkinlik doinBackground yönteminde kapanmaya zorlandığında async görevinde olur ve ardından asynctask onPostexecute yöntemine döner.


1

Bunun için başka bir çözümüm var ve bunun sizin için geçerli olup olmadığını bilmek istiyorum: önde gelen çözüm gibi görünen onDestroy'da reddetmek yerine, ProgressDialog'u genişletiyorum ...

public class MyProgressDialog extends ProgressDialog {

  private boolean isDismissed;

  public MyProgressDialog(Context context) {
    super(context);
  }

  @Override
  public void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    dismiss();
  }

  @Override
  public void dismiss() {
    if (isDismissed) {
      return;
    }
    try {
      super.dismiss();
    } catch (IllegalArgumentException e) {
      // ignore
    }
    isDismissed = true;
  }

Bu tercih edilir, AFAIC, çünkü ilerleme diyalogunu üye olarak tutmanız gerekmez, sadece ateşleyin (gösterin) ve unutun

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.