Jendela aktivitas bocor yang semula ditambahkan

1163

Apa kesalahan ini, dan mengapa itu terjadi?

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)
Pentium10
sumber
6
Klasik lainnya adalah ketika orientasi berubah: stackoverflow.com/questions/1111980/…
rds

Jawaban:

1561

Anda mencoba menampilkan Dialog setelah Anda keluar dari Aktivitas.

[EDIT]

Pertanyaan ini adalah salah satu pencarian teratas di google untuk pengembang android, oleh karena itu Menambahkan beberapa poin penting dari komentar, yang mungkin lebih bermanfaat bagi simpatisan masa depan tanpa membahas percakapan komentar secara mendalam.

Jawaban 1 :

Anda mencoba menampilkan Dialog setelah Anda keluar dari Aktivitas.

Jawaban 2

Kesalahan ini dapat sedikit menyesatkan dalam beberapa keadaan (meskipun jawabannya masih sepenuhnya akurat) - yaitu dalam kasus saya, Pengecualian yang tidak tertangani dilemparkan ke dalam AsyncTask, yang menyebabkan Kegiatan ditutup, kemudian progressdialog terbuka menyebabkan Pengecualian ini .. jadi pengecualian 'nyata' sedikit lebih awal dalam log

Jawaban 3

Abaikan panggilan () pada instance Dialog yang Anda buat sebelum keluar dari Aktivitas Anda, misalnya di onPause () atau onDestroy ()

Alex Volovoy
sumber
2
@Override public void onStop () {if (dialog! = Null) {dialog.dismiss (); dialog = null; }}
Md.Tarikul Islam
14
Bahkan setelah 8 tahun ini masih relevan! Saya mendapat pengecualian karena aktivitas ditutup ketika sedang mencoba untuk menampilkan AlertDialog saya (jadi Jawab 2). Pada akhirnya saya menemukan bahwa aplikasi tersebut menambahkan objek "null" ke tempat kejadian (seharusnya tidak terjadi tetapi itu terjadi) tetapi tidak memberikan pengecualian tambahan untuk itu dan semuanya ditutup oleh "bocor" "kecuali window"
Neph
Apakah mungkin untuk memindai semua dialog terbuka dan menutup semuanya di onStop ()? Saya menghasilkan dialog di ListView ketika mengklik item. Saya tidak yakin bagaimana cara mengambil referensi mereka dari onStop.
Myoch
1
Jawaban 3 adalah solusi terbaik. bekerja sangat baik untuk saya. Terima kasih kaze, Alex !!
amit bansode
tip tambahan jika Anda menampilkan dialog dalam satu lingkaran untuk memastikan loop keluar setelah aktivitas selesai
Thecarisma
406

Solusinya adalah memanggil dismiss()yang DialogAnda buat viewP.java:183sebelum keluar dari Activity, misalnya di onPause(). Semua Windows Dialogharus ditutup sebelum meninggalkan a Activity.

Molnarm
sumber
3
Jadi ketika pengguna memutar telepon, semua dialog harus ditutup ?? Kedengarannya tidak benar.
LarsH
@ LarsH seperti yang Anda lihat, jawaban saya ditulis lebih dari 7 tahun yang lalu, dan ini benar pada saat itu. Saya tidak lagi bekerja dengan Android, tetapi berdasarkan apa yang saya lihat dalam dokumentasi , mungkin masih tetap demikian, tetapi Android telah berjalan jauh sejak itu (memperkenalkan Fragmen hanya untuk menyebutkan satu), jadi mungkin sekarang lebih mudah.
molnarm
108

Jika Anda menggunakan AsyncTask, mungkin pesan log itu bisa menipu. Jika Anda melihat log Anda, Anda mungkin menemukan kesalahan lain, mungkin satu dalam doInBackground()metode Anda AsyncTask, yaitu membuat arus Anda Activitymeledak, dan dengan demikian setelah AsyncTaskkembali .. well, Anda tahu sisanya. Beberapa pengguna lain sudah menjelaskan bahwa di sini :-)

ggomeze
sumber
22
Terkadang dalam kasus itu saya tidak dapat melihat pengecualian yang sebenarnya. Untuk menemukan pengecualian sebenarnya, beri komentar progressDialog.show () dan jalankan aplikasi lagi .. sekarang Anda melihatnya.
Terjebak
Hai teman-teman! Seperti yang disebutkan di atas oleh @Stuck saya tidak dapat melihat pengecualian sebenarnya juga, Apa yang saya lakukan? Saya dilacak menggunakan melanggar poin dan saya menemukan bahwa saya menggunakan referensi dari kelas Aplikasi dalam metode doInBackgrounddari AsyncTaskkelas tapi tanpa mendeklarasikan dalam AndroidManifestfile menggunakan properti android:nameseperti ini: android:name="my.package.MyApplicationClass". Praktik yang baik saat menggunakannya AsyncTaskselalu ingat untuk membuat peringatan Anda di dalam metode onPreExecutedan mengabaikannya onPostExecute.
GFPF
66

Saya memicu kesalahan ini dengan panggilan yang salah hide()alih-alih dismiss()pada AlertDialog.

Mark Phillip
sumber
4
Persis apa yang terjadi pada saya. Juga, memanggil hide () dan kemudian mengatur dialog ke null juga bukan alternatif yang valid.
Lucas Tulio
Saya benar-benar tahu masalah di balik ini. Tapi memanggil pemberhentian () membantu saya!
Karoly
59

Anda bisa mendapatkan pengecualian ini hanya dengan kesalahan sederhana / bodoh, dengan (misalnya) panggilan tidak sengaja finish()setelah menampilkan AlertDialog, jika Anda melewatkan pernyataan panggilan balik dalam pernyataan beralih ...

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

The finish()Metode akan menutup Activity, tetapiAlertDialog masih menampilkan!

Jadi ketika Anda menatap kode dengan saksama, mencari masalah threading yang buruk atau pengkodean kompleks dan semacamnya, jangan lupakan hutan untuk melihat pepohonan. Kadang-kadang bisa menjadi sesuatu yang sederhana dan bodoh seperti pernyataan istirahat yang hilang. :)

Adrian Romanelli
sumber
Kurang lebih tepatnya masalah saya. Disebut selesai di onError setelah dialog dibuat, bukan di onClick untuk tombol pemberhentian.
jbass
46

Jawaban atas pertanyaan ini semuanya benar, tetapi sedikit membingungkan bagi saya untuk benar-benar mengerti mengapa. Setelah bermain-main selama sekitar 2 jam alasan kesalahan ini (dalam kasus saya) mengenai saya:

Anda sudah tahu, dari membaca jawaban lain, bahwa X has leaked window DecorView@d9e6131[]kesalahan berarti dialog terbuka ketika aplikasi Anda ditutup. Tapi kenapa?

Bisa jadi, aplikasi Anda mogok karena alasan lain saat dialog Anda terbuka

Ini mengarah pada penutupan aplikasi Anda karena beberapa bug dalam kode Anda, yang menyebabkan dialog tetap terbuka pada saat yang sama dengan aplikasi Anda ditutup karena kesalahan lainnya.

Jadi, perhatikan logika Anda. Selesaikan kesalahan pertama, dan kemudian kesalahan kedua akan menyelesaikan sendirimasukkan deskripsi gambar di sini

Satu kesalahan menyebabkan yang lain, yang menyebabkan yang lain, seperti DOMINOS!

Ruchir Baronia
sumber
2
Tidak percaya ini hanya memiliki satu upvote .. atau kami benar-benar buruk dalam pemrograman hahaha Saya juga menyukai analogi domino Anda
user2161301
Selesaikan kesalahan pertama dan kesalahan kedua tidak akan terjadi . Analogi ini membantu saya.
itabdullah
Ini tidak sepenuhnya benar, contoh seperti rotasi telepon juga dapat menyebabkan rotasi "aktivitas" terjadi.
Sreekanth Karumanaghat
36

Masalah ini muncul ketika mencoba menampilkan Dialog setelah Anda keluar dari suatu Kegiatan.

Saya baru saja memecahkan masalah ini hanya dengan menuliskan kode berikut:

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

Pada dasarnya, dari kelas mana Anda memulai progressDialog, timpa metode onDestroy dan lakukan cara ini. Itu memecahkan masalah "Aktivitas telah bocor jendela".

Shoaib Ahmed
sumber
onDestroy tidak dijamin dipanggil. Lebih baik memasukkan kode itu di onPause atau onStop
Amruta-Pani
19

Baru-baru ini saya menghadapi masalah yang sama.

Alasan di balik masalah ini adalah bahwa kegiatan ditutup sebelum dialog diberhentikan. Ada berbagai alasan untuk hal di atas terjadi. Yang disebutkan dalam posting di atas juga benar.

Saya masuk ke suatu situasi, karena di utas, saya memanggil fungsi yang melempar pengecualian. Karena itu jendela diberhentikan dan karenanya pengecualian.

Tushar
sumber
16

Singkirkan dialog saat aktivitas dihancurkan

@Override
protected void onDestroy()
{
    super.onDestroy();
    if (pDialog!=null && pDialog.isShowing()){
        pDialog.dismiss();
    }
}
Muhammad Aamir Ali
sumber
jika pDialog adalah nol, ini akan menimbulkan kesalahan saat Anda menanyakan keadaan dialog nol
Jonathan Dunn
1
tidak itu tidak akan @JonDunn, karena Java tidak akan memproses boolean kedua jika yang pertama salah
matdev
13

Ini bisa membantu.

if (! isFinishing()) {

    dialog.show();

    }
berpasir
sumber
2
Di antara ratusan jawaban serupa, tidak ada yang menunjukkan cara memeriksa apakah windows ada. Jadi, Anda menghemat waktu mencari cara untuk melakukannya. Terima kasih.
kolyaseg
11

Saya memiliki pesan kesalahan yang sama dan tidak tahu mengapa. Diberi petunjuk dari jawaban sebelumnya, saya mengubah panggilan non-GUI saya ke mDialog.finish () menjadi mDialog.dismiss () dan kesalahannya hilang. Ini tidak memengaruhi perilaku widget saya, tetapi membingungkan dan bisa saja menandai kebocoran memori yang penting.

Melinda Green
sumber
Melihat bahwa saya sedang melakukan panggilan mDialog.hide () sebelum panggilan finish (). Mengubahnya ke mDialog.dismiss () berhasil.
mays
11

Saya mendapatkan log ini di aplikasi pemutar video saya. Pesan-pesan ini dibuang saat pemutar video ditutup. Menariknya, saya biasa mendapatkan log ini sekali dalam beberapa kali secara acak. Juga aplikasi saya tidak terlibat progressdialog. Akhirnya, saya menyelesaikan masalah ini dengan implementasi di bawah ini.

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

Timpa OnPausepanggilan with to mVideoView.pause()dan set visibilityto GONE. Dengan cara ini saya bisa menyelesaikan masalah " Activity has leaked window" log error.

InvisiblePoint
sumber
Saya juga menghadapi masalah yang sama. saya menambahkan baris kode ini dalam kode saya tetapi tidak berfungsi dan memberikan kesalahan yang sama "android.view.WindowLeaked yang awalnya ditambahkan" dan juga tidak memutar video dan memberikan "Video tidak dapat diputar"
User42590
10

Saya mengalami masalah yang sama dan menemukan halaman ini, dan sementara situasi saya berbeda, saya menelepon finishdari aif blok sebelum mendefinisikan kotak tanda.

Jadi, hanya menelepon dismisstidak akan berhasil (karena belum dibuat) tetapi setelah membaca jawaban Alex Volovoy dan menyadari itu adalah kotak peringatan yang menyebabkannya. Saya mencoba menambahkan pernyataan kembali tepat setelah selesai di dalamnyaif blok itu dan itu memperbaiki masalah.

Saya pikir begitu Anda menelepon selesai, berhenti semuanya dan selesai di sana, tetapi tidak. Tampaknya pergi ke ujung blok kode itu kemudian selesai.

Jadi, jika Anda ingin menerapkan situasi di mana kadang-kadang itu akan selesai sebelum melakukan beberapa kode Anda harus meletakkan pernyataan kembali tepat setelah selesai atau itu akan terus berjalan dan dan bertindak seperti selesai dipanggil pada akhir blok kode bukan tempat Anda menyebutnya. Itulah sebabnya saya mendapatkan semua kesalahan aneh itu.

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

Jika Anda tidak mengembalikan tepat setelah saya menelepon selesai di sana, itu akan bertindak seolah-olah Anda telah memanggilnya setelah alert.show(); dan karenanya akan mengatakan bahwa jendela bocor dengan menyelesaikan tepat setelah Anda membuat dialog muncul, meskipun itu tidak demikian, masih berpikir demikian.

Saya pikir saya akan menambahkan ini di sini karena ini menunjukkan perintah selesai bertindak berbeda maka saya pikir itu terjadi dan saya kira ada orang lain yang berpikir sama seperti yang saya lakukan sebelum saya menemukan ini.

Kit Ramos
sumber
7

Ini bukan jawaban untuk pertanyaan tetapi relevan dengan topik.

Jika aktivitas telah menetapkan atribut dalam Manifest

 android:noHistory="true"

kemudian setelah mengeksekusi onPause (), konteks aktivitas hilang. Jadi semua tampilan yang menggunakan konteks ini dapat memberikan kesalahan ini.

Pembunuh
sumber
Bisakah Anda menghubungkan hal serupa untuk progessdialog.show().. dan progressdialog.hide()dalam asynctaskaktivitas yang sama, bukan onPause()dari activity?? lihat masalah saya ... stackoverflow.com/questions/39332880/…
Bhuro
1
ini bekerja untuk saya dengan sempurna: android: noHistory = "true"
Shohel Rana
6

Tidak hanya mencoba menampilkan peringatan tetapi juga dapat dipanggil ketika Anda menyelesaikan contoh aktivitas tertentu dan mencoba memulai aktivitas / layanan baru atau mencoba menghentikannya.

Contoh:

OldActivity instance;

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

Secara umum masalah ini terjadi karena dialog progres: Anda dapat menyelesaikan ini dengan menggunakan salah satu metode berikut dalam aktivitas Anda:

 // 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();
                }
            }
Bapusaheb Shinde
sumber
5

Punya masalah di mana saya menyelesaikan Kegiatan ketika ProgressDialog masih ditampilkan.

Jadi pertama-tama sembunyikan Dialog dan kemudian selesaikan aktivitas.

LeonS
sumber
5

Coba kode ini:

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

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

}
tinku
sumber
progressdialog.dismiss();ini dapat membuat NullPointerException.
tpk
5

Ini bisa terjadi jika Anda memiliki kesalahan di doInBackground() fungsi dan memiliki kode ini.

Coba tambahkan dialog pada akhirnya. Pada awalnya periksa dan perbaiki doInBackground()fungsi

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();
NickUnuchek
sumber
5

Ini terjadi pada saya ketika saya menggunakan ProgressDialogdi AsyncTask. Sebenarnya saya menggunakan hide()metode dalam onPostExecute. Berdasarkan jawaban @Alex Volovoy saya perlu menggunakan dismiss()dengan ProgressDialoguntuk menghapusnya di onPostExecute dan selesai.

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

progressDialog.dismiss(); // Use it
SANAT
sumber
Ini bukan jawaban yang sebenarnya. Ada dua cara untuk membocorkan dialog. 1) Jika Anda memiliki AsyncTaskdan menunjukkan Dialog, maka sesuatu terjadi yang membuat Activitypanggilan onPause()(mungkin beberapa logika di AsyncTask Anda sendiri, seperti pendengar, maka akan bocor. 2) Seperti disebutkan di atas, Dialogyang dibuat dengan yang Activity Contexttidak pernah diberhentikan dan Activitybergerak terus.
tricknology
5

Kesalahan " Activity has leaked window that was originally added..." terjadi ketika Anda mencoba menunjukkan peringatan setelah Activitysecara efektif finished.

Anda memiliki dua opsi AFAIK:

  1. Memikirkan kembali login peringatan anda: panggilan dismiss()pada dialogsebelum benar-benar keluar aktivitas Anda.
  2. Letakkan dialogdi utas yang berbeda dan jalankan di situ thread(terlepas dari arus activity).
Kyle Clegg
sumber
5

di sini adalah solusi ketika Anda ingin mengabaikan AlertDialog tetapi tidak ingin menyimpan referensi dalamnya dalam aktivitas.

solusi mengharuskan Anda memiliki androidx.lifecycle ketergantungan di proyek Anda (saya percaya pada saat komentar itu adalah persyaratan umum)

ini memungkinkan Anda untuk mendelegasikan pemberhentian dialog ke objek eksternal (pengamat), dan Anda tidak perlu lagi mempedulikannya, karena ini berhenti berlangganan otomatis ketika aktivitas mati. (Ini buktinya: https://github.com/googlecodelabs/android-lifecycles/issues/5 ).

jadi, pengamat menyimpan referensi untuk dialog, dan aktivitas menyimpan referensi ke pengamat. ketika "onPause" terjadi - pengamat menolak dialog, dan ketika "onDestroy" terjadi - aktivitas menghapus pengamat, jadi tidak ada kebocoran yang terjadi (yah, setidaknya saya tidak melihat kesalahan di logcat lagi)

// 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()
}
dmz9
sumber
4

Pengecualian kebocoran jendela memiliki dua alasan:

1) menampilkan dialog ketika Konteks Kegiatan tidak ada, untuk menyelesaikan ini Anda harus menunjukkan dialog hanya Anda yakin Kegiatan ada:

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

2) tidak mengabaikan dialog dengan tepat, untuk menyelesaikan penggunaan kode ini:

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

Anda harus membuat Progressdialogobjek dalam onPreExecutemetode AsyncTaskdan Anda harus dismisspada onPostExecutemetode.

ammad
sumber
4

Solusi terbaik adalah menambahkan dialog di dialog coba tangkap dan abaikan saat pengecualian terjadi

Cukup gunakan kode di bawah ini

 try {
        dialog.show();
    } catch (Exception e) {
        dialog.dismiss();
    }
Ness Tyagi
sumber
3
bukankah dialog akan menjadi null setelah dipanggil selesai ?, saya pikir dialog.dismiss()akan menghasilkan kesalahan juga
Ashu Kumar
3

Dalam kasus saya, alasannya adalah saya lupa memasukkan izin dalam file manifes Android.

Bagaimana saya mengetahuinya? Yah, sama seperti @ Bobby mengatakan dalam komentar di bawah jawaban yang diterima, cukup gulir lebih jauh ke log Anda dan Anda akan melihat alasan pertama atau peristiwa yang benar-benar melemparkan Pengecualian. Tampaknya, pesan "Jendela aktivitas bocor yang semula ditambahkan" hanyalah Pengecualian yang dihasilkan dari apa pun Pengecualian pertama.

Matthew Quiros
sumber
3

Coba kode di bawah ini, ini akan berfungsi kapan saja Anda akan mengabaikan dialog progres dan ia akan melihat apakah instansinya tersedia atau tidak.

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

Solusi terbaik adalah meletakkan ini sebelum ditampilkan progressbaratauprogressDialog

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

  //Show Your Progress Dialog

}
Ali Akram
sumber
Ini tidak berhasil untuk saya. Saya memiliki Dialog.show () setelah respons dari panggilan HTTP dan ketika itu saya memutar layar Aktivitas dilepaskan tetapi tampaknya memiliki isShown == true sebelum Dialog.show () dan kemudian Dialog lumpuh meskipun ada pemeriksaan ini
Michał Ziobro
1

Pastikan aktivitas Anda tidak menutup secara tak terduga karena beberapa pengecualian yang muncul di suatu tempat dalam kode Anda. Umumnya itu terjadi dalam tugas async ketika aktivitas menghadapi penutupan paksa dalam metode doinBackground dan kemudian asynctask kembali ke metode onPostexecute.

Manas Ranjan
sumber
1

Saya punya solusi lain untuk ini, dan ingin tahu apakah itu berlaku bagi Anda: daripada mengabaikan onDestroy, yang tampaknya menjadi solusi utama, saya memperluas ProgressDialog ...

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

Ini lebih disukai, AFAIC, karena Anda tidak perlu menahan dialog progres sebagai anggota, cukup jalankan (tampilkan) dan lupakan

Kalisky
sumber