Apa kesalahan ini ... saya belum menemukan diskusi tentang kesalahan ini di komunitas stackoverflow Detail: -
10-18 23:53:11.613: ERROR/AndroidRuntime(3197): Uncaught handler: thread main exiting due to uncaught exception
10-18 23:53:11.658: ERROR/AndroidRuntime(3197): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@45d459c0 is not valid; is your activity running?
10-18 23:53:11.658: ERROR/AndroidRuntime(3197): at android.view.ViewRoot.setView(ViewRoot.java:468)
10-18 23:53:11.658: ERROR/AndroidRuntime(3197): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
10-18 23:53:11.658: ERROR/AndroidRuntime(3197): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
10-18 23:53:11.658: ERROR/AndroidRuntime(3197): at android.view.Window$LocalWindowManager.addView(Window.java:424)
10-18 23:53:11.658: ERROR/AndroidRuntime(3197): at android.app.Dialog.show(Dialog.java:239)
10-18 23:53:11.658: ERROR/AndroidRuntime(3197): at com.vishal.contacte.Locationlistener$MyLocationListener.onLocationChanged(Locationlistener.java:86)
10-18 23:53:11.658: ERROR/AndroidRuntime(3197): at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:179)
10-18 23:53:11.658: ERROR/AndroidRuntime(3197): at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:112)
10-18 23:53:11.658: ERROR/AndroidRuntime(3197): at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:128)
10-18 23:53:11.658: ERROR/AndroidRuntime(3197): at android.os.Handler.dispatchMessage(Handler.java:99)
10-18 23:53:11.658: ERROR/AndroidRuntime(3197): at android.os.Looper.loop(Looper.java:123)
10-18 23:53:11.658: ERROR/AndroidRuntime(3197): at android.app.ActivityThread.main(ActivityThread.java:4363)
10-18 23:53:11.658: ERROR/AndroidRuntime(3197): at java.lang.reflect.Method.invokeNative(Native Method)
10-18 23:53:11.658: ERROR/AndroidRuntime(3197): at java.lang.reflect.Method.invoke(Method.java:521)
10-18 23:53:11.658: ERROR/AndroidRuntime(3197): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862)
10-18 23:53:11.658: ERROR/AndroidRuntime(3197): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
10-18 23:53:11.658: ERROR/AndroidRuntime(3197): at dalvik.system.NativeStart.main(Native Method)
Jawaban:
Ini kemungkinan besar terjadi karena Anda mencoba untuk menampilkan dialog setelah mengeksekusi utas latar belakang, sementara Aktivitas sedang dihancurkan.
Saya melihat kesalahan ini dilaporkan sesekali dari beberapa aplikasi saya ketika aktivitas yang memanggil dialog selesai karena beberapa alasan atau lainnya ketika mencoba menampilkan dialog. Inilah yang memecahkannya untuk saya:
Saya telah menggunakan ini untuk mengatasi masalah pada versi Android yang lebih lama selama beberapa tahun sekarang, dan belum melihat crash sejak itu.
sumber
Saya menghadapi masalah yang sama dan menggunakan kode yang diusulkan oleh DiscDev di atas dengan perubahan kecil sebagai berikut:
sumber
jika dialog mengatasi masalah ini karena utas Anda harus menjalankan ini pada utas UI seperti itu: -
sumber
Kesalahan ini terjadi ketika Anda menampilkan dialog untuk konteks yang tidak ada lagi.
Sebelum menelepon
.show()
periksa bahwa aktivitas / konteks belum selesaisumber
Saya mengalami kesalahan ini ketika saya punya
countDownTimer
di aplikasi saya. Itu metode memanggil GameOver di aplikasi saya sebagaitetapi sebenarnya permainan bisa berakhir sebelum waktunya habis karena klik yang salah dari pengguna (itu adalah permainan mengklik). Jadi ketika saya melihat dialog Game Over setelah mis. 20 detik, saya lupa membatalkannya
countDownTimer
begitu waktu habis, dialog muncul lagi. Atau jatuh dengan kesalahan di atas karena suatu alasan.sumber
Cara mengatasinya cukup sederhana. Cukup uji apakah Kegiatan sedang melewati tahap akhir sebelum menampilkan Dialog:
lihat lebih lanjut di sini
sumber
Dalam kasus saya, masalahnya adalah yang
Context
disimpan sebagai referensi lemah di kelas yang meluasHandler
. Kemudian saya lewatMessenger
, yang membungkus pawang, melalui sebuahIntent
keService
. Saya melakukan ini setiap kali aktivitas muncul di layar dalamonResume()
metode.Jadi seperti yang Anda pahami, Messenger diserialisasi bersama dengan bidangnya (termasuk konteks), karena itu adalah satu-satunya cara untuk melewatkan objek menggunakan
Intent
- untuk membuat cerita bersambung. Pada saat Messenger dilewatkan ke layanan, aktivitas itu sendiri masih belum siap untuk menampilkan dialog seperti di negara lain (dikatakan padaResume (), yang sama sekali berbeda dari ketika aktivitas sudah ada di layar). Jadi ketika messenger dideserialisasi, konteksnya masih pada keadaan melanjutkan, sementara aktivitas sebenarnya sudah di layar. Selain itu, deserialisasi mengalokasikan memori untuk objek baru, yang sama sekali berbeda dari yang asli.Solusinya adalah hanya dengan mengikat ke layanan setiap kali Anda membutuhkannya dan mengembalikan binder yang memiliki metode seperti 'setMessenger (Messenger messenger)' dan menyebutnya, ketika Anda diikat ke layanan.
sumber
Saya mengatasi masalah ini dengan menggunakan
WeakReference<Activity>
sebagai konteks. Kecelakaan itu tidak pernah muncul lagi. Berikut ini contoh kode di Kotlin:Kelas manajer dialog:
Dan Anda menampilkan dialog seperti ini:
Jika Anda ingin super-duper dilindungi dari crash. Alih-alih
builder.create().show()
menggunakan:Inilah
safeShow
metodenya:Ini adalah metode serupa yang dapat Anda gunakan untuk mengabaikan dialog dengan aman:
sumber
bagaimana dengan membuat Instance baru dari dialog yang ingin Anda panggil? Saya sebenarnya baru saja bertemu masalah yang sama, dan itulah yang saya lakukan. jadi daripada:
bagaimana dengan ini?
jadi daripada hanya memeriksa apakah aman atau tidak untuk menampilkan dialog, saya pikir itu jauh lebih aman jika kita hanya membuat contoh baru untuk menampilkan dialog.
Seperti saya, Dalam kasus saya, saya mencoba membuat satu instance (dari onCreate Fragment ) dan memanggil instance dari dialog tersebut di konten adapterList lain dan ini akan menghasilkan "is your activity running" - error . Saya pikir itu karena saya baru saja membuat satu instance (dari onCreate) dan kemudian dihancurkan, jadi ketika saya mencoba memanggilnya dari adapterList lain, saya memanggil dialog dari instance lama.
Saya tidak yakin apakah solusi saya ramah-memori atau tidak, karena saya belum mencoba profilnya, tetapi berfungsi (tentu saja, aman jika Anda tidak membuat terlalu banyak contoh)
sumber