Saya mengalami beberapa pengecualian berikut:
java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:355)
at android.view.WindowManagerImpl.updateViewLayout(WindowManagerImpl.java:191)
at android.view.Window$LocalWindowManager.updateViewLayout(Window.java:428)
at android.app.Dialog.onWindowAttributesChanged(Dialog.java:596)
at android.view.Window.setDefaultWindowFormat(Window.java:1013)
at com.android.internal.policy.impl.PhoneWindow.access$700(PhoneWindow.java:86)
at com.android.internal.policy.impl.PhoneWindow$DecorView.drawableChanged(PhoneWindow.java:1951)
at com.android.internal.policy.impl.PhoneWindow$DecorView.fitSystemWindows(PhoneWindow.java:1889)
at android.view.ViewRoot.performTraversals(ViewRoot.java:727)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4338)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
Saya telah mencari di Google dan melihat bahwa itu ada hubungannya dengan munculan dan memutar layar, tetapi tidak ada referensi ke kode saya.
Pertanyaannya adalah:
- apakah ada cara untuk mengetahui dengan tepat kapan masalah ini terjadi?
- selain memutar layar, apakah ada peristiwa atau tindakan lain yang memicu error ini?
- bagaimana cara mencegah hal ini terjadi?
View#onAttachedToWindow()
dipanggil?Jawaban:
Saya mengalami masalah ini di mana pada orientasi layar berubah, aktivitas selesai sebelum AsyncTask dengan dialog kemajuan selesai. Sepertinya saya menyelesaikan ini dengan menyetel dialog ke null
onPause()
dan kemudian memeriksanya di AsyncTask sebelum menutupnya.... di AsyncTask saya:
sumber
Setelah berkelahi dengan masalah ini, saya akhirnya mendapatkan solusi ini:
Terkadang, penanganan pengecualian yang baik berfungsi dengan baik jika tidak ada solusi yang lebih baik untuk masalah ini.
sumber
Jika Anda memiliki
Activity
benda yang berkeliaran, Anda dapat menggunakanisDestroyed()
metode ini:Ini bagus jika Anda memiliki
AsyncTask
subkelas non-anonim yang Anda gunakan di berbagai tempat.sumber
Saya menggunakan kelas statis kustom yang membuat- menunjukkan dan menyembunyikan dialog. kelas ini digunakan oleh kegiatan lain juga tidak hanya satu kegiatan. Sekarang masalah yang Anda jelaskan juga muncul pada saya dan saya telah menginap untuk mencari solusinya ..
Akhirnya saya sampaikan solusinya!
jika Anda ingin menampilkan atau menutup dialog dan Anda tidak tahu aktivitas mana yang memulai dialog untuk menyentuhnya, maka kode berikut ini untuk Anda ..
sumber
Solusi di atas tidak berhasil untuk saya. Jadi yang saya lakukan adalah mengambil
ProgressDialog
secara global dan kemudian menambahkan ini ke aktivitas sayaSehingga jika aktivitas dimusnahkan maka ProgressDialog juga akan dimusnahkan.
sumber
Untuk pertanyaan 1):
Mengingat pesan kesalahan tampaknya tidak mengatakan baris mana dari kode Anda yang menyebabkan masalah, Anda dapat melacaknya dengan menggunakan breakpoint. Breakpoints menghentikan eksekusi program ketika program mencapai baris kode tertentu. Dengan menambahkan breakpoint ke lokasi penting, Anda dapat menentukan baris kode mana yang menyebabkan error. Misalnya, jika program Anda mengalami error pada baris setContentView (), Anda bisa meletakkan breakpoint di sana. Saat program berjalan, program akan berhenti sebelum menjalankan jalur tersebut. Jika kemudian melanjutkan menyebabkan program macet sebelum mencapai breakpoint berikutnya, Anda kemudian tahu bahwa baris yang mematikan program berada di antara dua breakpoint.
Menambahkan titik putus itu mudah jika Anda menggunakan Eclipse. Klik kanan di margin tepat di sebelah kiri kode Anda dan pilih "Toggle breakpoint". Anda kemudian perlu menjalankan aplikasi Anda dalam mode debug, tombol yang terlihat seperti serangga hijau di sebelah tombol jalankan normal. Ketika program mencapai breakpoint, Eclipse akan beralih ke perspektif debug dan menunjukkan baris yang ditunggu. Untuk memulai program berjalan lagi, cari tombol 'Lanjutkan', yang terlihat seperti 'Putar' normal tetapi dengan bilah vertikal di sebelah kiri segitiga.
Anda juga dapat mengisi aplikasi Anda dengan Log.d ("Aplikasi saya", "Beberapa informasi di sini yang memberi tahu Anda di mana baris log"), yang kemudian memposting pesan di jendela LogCat Eclipse. Jika Anda tidak dapat menemukan jendela itu, buka dengan Window -> Show View -> Other ... -> Android -> LogCat.
Semoga membantu!
sumber
Saya menambahkan berikut ini ke manifes untuk aktivitas itu
sumber
sesuai dengan kode windowManager (tautan di sini ), ini terjadi saat tampilan yang Anda coba perbarui (yang mungkin termasuk dalam dialog, tetapi tidak perlu) tidak lagi terpasang ke root windows yang sebenarnya.
seperti yang disarankan orang lain, Anda harus memeriksa status aktivitas sebelum melakukan operasi khusus pada dialog Anda.
inilah kode yang relevan, yang merupakan penyebab masalah (disalin dari kode sumber Android):
sumber
Masalah saya diselesaikan dengan uhmengunci rotasi layar di android saya, aplikasi yang menyebabkan saya masalah sekarang bekerja dengan sempurna
sumber
Opsi lainnya adalah tidak memulai tugas asinkron hingga dialog dilampirkan ke jendela dengan menimpa onAttachedToWindow () pada dialog, dengan cara itu ia selalu dapat ditutup.
sumber
Atau Cukup Anda Dapat menambahkan
yang akan membuat
ProgressDialog
to tidak bisa dibatalkansumber
Mengapa tidak mencoba menangkap, seperti ini:
sumber
saat Anda mendeklarasikan aktivitas dalam manifes, Anda memerlukan android: configChanges = "orientasi"
contoh:
sumber