Saya menggunakan ACRA untuk melaporkan kerusakan aplikasi. Saya menerima View not attached to window manager
pesan kesalahan dan berpikir saya telah memperbaikinya dengan membungkus pDialog.dismiss();
dalam pernyataan if:
if (pDialog!=null)
{
if (pDialog.isShowing())
{
pDialog.dismiss();
}
}
Ini telah mengurangi jumlah View not attached to window manager
crash yang saya terima, tetapi saya masih mendapatkan beberapa crash dan saya tidak yakin bagaimana menyelesaikannya.
Pesan eror:
java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:425)
at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:327)
at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:83)
at android.app.Dialog.dismissDialog(Dialog.java:330)
at android.app.Dialog.dismiss(Dialog.java:312)
at com.package.class$LoadAllProducts.onPostExecute(class.java:624)
at com.package.class$LoadAllProducts.onPostExecute(class.java:1)
at android.os.AsyncTask.finish(AsyncTask.java:631)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5419)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
at dalvik.system.NativeStart.main(Native Method)
Cuplikan kode:
class LoadAllProducts extends AsyncTask<String, String, String>
{
/**
* Before starting background thread Show Progress Dialog
* */
@Override
protected void onPreExecute()
{
super.onPreExecute();
pDialog = new ProgressDialog(CLASS.this);
pDialog.setMessage("Loading. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
/**
* getting All products from url
* */
protected String doInBackground(String... args)
{
// Building Parameters
doMoreStuff("internet");
return null;
}
/**
* After completing background task Dismiss the progress dialog
* **/
protected void onPostExecute(String file_url)
{
// dismiss the dialog after getting all products
if (pDialog!=null)
{
if (pDialog.isShowing())
{
pDialog.dismiss(); //This is line 624!
}
}
something(note);
}
}
Nyata:
<activity
android:name="pagename.CLASS"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout"
android:label="@string/name" >
</activity>
Apa yang saya lewatkan untuk menghentikan kecelakaan ini terjadi?
AsyncTask
dinyatakan di dalamActivity
atauFragment
?Jawaban:
Cara mereproduksi bug:
Settings -> Developer Options -> Don't keep Activities
.AsyncTask
sedang mengeksekusi danProgressDialog
sedang ditampilkan.OS Android akan menghancurkan aktivitas segera setelah disembunyikan. Kapan
onPostExecute
disebutActivity
akan dalam "finishing" danProgressDialog
tidak akan dilampirkanActivity
.Bagaimana memperbaikinya:
onPostExecute
metode Anda .ProgressDialog
inonDestroy
. Kalau tidak,android.view.WindowLeaked
pengecualian akan dibuang. Pengecualian ini biasanya berasal dari dialog yang masih aktif ketika aktivitas selesai.Coba kode tetap ini:
sumber
isDestroyed()
lebihisFinishing()
dari semua API untuk tujuan khusus ini?isFinishing()
tidak dijamintrue
jika aktivitas dihancurkan oleh sistem, lihat dokumentasi tentang Aktivitas .// or call isFinishing() if min sdk version < 17
, ia mengalami pengecualian yang sama. Jadi, kami membutuhkan solusi yang berbeda dari jawaban ini untuk aplikasi yang berjalan di API <17.myActivityWeakReference.get() != null && !myActivityWeakReference.get().isFinishing()
Masalahnya bisa jadi
Activity
sudahfinished
atau sudah masukprogress of finishing
.Tambahkan tanda centang
isFinishing
, dan abaikan dialog hanya saat inifalse
isFinishing: Periksa untuk melihat apakah kegiatan ini sedang dalam proses penyelesaian, baik karena Anda memanggilnya
finish
atau orang lain telah meminta agar kegiatannya selesai.sumber
Untuk
Dialog
dibuat dalam aFragment
, saya menggunakan kode berikut:Saya menggunakan pola ini untuk menangani kasus ketika
Fragment
mungkin terlepas dariActivity
.sumber
Lihat bagaimana Kode bekerja di sini:
Setelah memanggil tugas Async, tugas async berjalan di latar belakang. itu yang diinginkan. Sekarang, tugas Async ini memiliki dialog progres yang dilampirkan ke Activity, jika Anda bertanya bagaimana melihat kode:
Anda melewati
Class.this
konteks as ke argumen. Jadi dialog Progress masih melekat pada aktivitas.Sekarang pertimbangkan skenario: Jika kami mencoba menyelesaikan aktivitas menggunakan metode finish (), saat tugas async sedang berlangsung, adalah titik di mana Anda mencoba mengakses Sumberdaya yang terlampir pada aktivitas yaitu
progress bar
saat aktivitas tidak lagi sana.Karenanya Anda mendapatkan:
Solusi untuk ini:
1) Pastikan kotak Dialog dibubarkan atau dibatalkan sebelum aktivitas selesai.
2) Selesaikan aktivitas, hanya setelah kotak dialog diberhentikan, tugas async selesai.
sumber
Activity
; Android dapat menyelesaikannya kapan saja. Jadi, # 2 tidak masuk akal.Berdasarkan jawaban @erakitin, tetapi juga kompatibel untuk versi Android <API level 17. Sedihnya Activity.isDestroyed () hanya didukung sejak API level 17, jadi jika Anda menargetkan level API yang lebih lama seperti saya, Anda harus periksa sendiri. Belum mendapatkan
View not attached to window manager
pengecualian setelah itu.Kode contoh
sumber
lihat ini .
sumber
Override onConfigurationChanged dan abaikan dialog progres. Jika dialog progres dibuat dalam potret dan ditolak dalam lanskap, maka dialog itu akan menampilkan Lihat tidak terlampir pada kesalahan manajer jendela.
Juga hentikan bilah progres dan hentikan tugas asinkron dalam metode onPause (), onBackPressed dan onDestroy.
sumber
Ganti onDestroy dari Aktivitas dan Singkirkan Dialog Anda & jadikan null
sumber
Pertama, alasan crash adalah indeks decorView -1, kita bisa mengetahuinya dari kode sumber Android, ada potongan kode:
jadi kita mendapatkan resolusi ikuti, hanya menilai indeks decorView, jika lebih dari 0 lalu melanjutkan atau hanya kembali dan berhenti, kode sebagai berikut:
sumber
Overide
dismiss()
metode seperti ini:Untuk mereproduksi masalah, selesaikan aktivitas sebelum mengabaikan dialog.
sumber
solusi terbaik. Periksa konteks pertama adalah konteks aktivitas atau konteks aplikasi jika konteks aktivitas maka hanya memeriksa aktivitas selesai atau tidak maka panggilan
dialog.show()
ataudialog.dismiss();
Jika Anda ingin menambahkan lebih banyak cek maka tambahkan
dialog.isShowing()
ataudialog !-null
gunakan&&
ketentuan.sumber
Masalah ini karena aktivitas Anda selesai sebelum fungsi pemberhentian dipanggil. Tangani pengecualian dan periksa log ADB Anda untuk alasan yang tepat.
sumber
Saya punya cara untuk mereproduksi pengecualian ini.
Saya menggunakan 2
AsyncTask
. Satu melakukan tugas panjang dan yang lainnya melakukan tugas pendek. Setelah tugas singkat selesai, hubungifinish()
. Ketika tugas yang panjang selesai dan panggilanDialog.dismiss()
, itu crash.Ini kode contoh saya:
Anda dapat mencoba ini dan mencari tahu apa cara terbaik untuk memperbaiki masalah ini. Dari penelitian saya, setidaknya ada 4 cara untuk memperbaikinya:
isFinishing()
untuk memeriksa status aktivitasAsyncTask.cancel(false)
dionDestroy()
. Ini akan mencegah asynctask untuk mengeksekusionPostExecute()
tetapi mengeksekusionCancelled()
sebagai gantinya.Catatan:
onPostExecute()
masih akan mengeksekusi bahkan jika Anda memanggilAsyncTask.cancel(false)
OS Android yang lebih lama, seperti Android 2.XXAnda dapat memilih yang terbaik untuk Anda.
sumber
Mungkin Anda menginisialisasi pDialog secara global, kemudian hapus dan intialize tampilan atau dialog Anda secara lokal. Saya memiliki masalah yang sama, saya telah melakukan ini dan masalah saya sudah teratasi. Semoga ini akan berhasil untuk Anda.
sumber
kami juga telah mengabaikan dialog kami tentang
onPause
metode atauonDestroy
metodesumber