Saya memiliki aktivitas yang memulai AsyncTask dan menampilkan dialog progres selama operasi. Aktivitas ini dinyatakan TIDAK diciptakan kembali oleh rotasi atau slide keyboard.
<activity android:name=".MyActivity"
android:label="@string/app_name"
android:configChanges="keyboardHidden|orientation"
>
<intent-filter>
</intent-filter>
</activity>
Setelah tugas selesai, saya menolak dialog, tetapi pada beberapa ponsel (kerangka kerja: 1,5, 1,6) kesalahan tersebut dilemparkan:
java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:356)
at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:201)
at android.view.Window$LocalWindowManager.removeView(Window.java:400)
at android.app.Dialog.dismissDialog(Dialog.java:268)
at android.app.Dialog.access$000(Dialog.java:69)
at android.app.Dialog$1.run(Dialog.java:103)
at android.app.Dialog.dismiss(Dialog.java:252)
at xxx.onPostExecute(xxx$1.java:xxx)
Kode saya adalah:
final Dialog dialog = new AlertDialog.Builder(context)
.setTitle("Processing...")
.setCancelable(true)
.create();
final AsyncTask<MyParams, Object, MyResult> task = new AsyncTask<MyParams, Object, MyResult>() {
@Override
protected MyResult doInBackground(MyParams... params) {
// Long operation goes here
}
@Override
protected void onPostExecute(MyResult result) {
dialog.dismiss();
onCompletion(result);
}
};
task.execute(...);
dialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface arg0) {
task.cancel(false);
}
});
dialog.show();
Dari apa yang saya baca ( http://bend-ing.blogspot.com/2008/11/properly-handle-progress-dialog-in.html ) dan terlihat di sumber Android, sepertinya satu-satunya situasi yang mungkin untuk mendapatkan itu pengecualian adalah saat aktivitas dihancurkan. Tetapi seperti yang telah saya sebutkan, saya melarang kegiatan rekreasi untuk acara-acara dasar.
Jadi setiap saran sangat dihargai.
Jawaban:
Saya juga mendapatkan kesalahan ini kadang-kadang ketika saya mengabaikan dialog dan menyelesaikan aktivitas dari metode onPostExecute. Saya kira terkadang kegiatan selesai sebelum dialog berhasil ditolak.
Solusi sederhana namun efektif yang bekerja untuk saya
sumber
Inilah solusi "bukti peluru" saya, yang merupakan kompilasi dari semua jawaban bagus yang saya temukan pada topik ini (terima kasih kepada @Damjan dan @Kachi). Di sini pengecualian ditelan hanya jika semua cara deteksi lainnya tidak berhasil. Dalam kasus saya, saya perlu menutup dialog secara otomatis dan ini adalah satu-satunya cara untuk melindungi aplikasi dari kerusakan. Saya harap ini akan membantu Anda! Silakan, beri suara dan tinggalkan komentar jika Anda memiliki komentar atau solusi yang lebih baik. Terima kasih!
sumber
dialog = null
tidak memiliki efek apa pun. DanStatusEventDialog
harus dibaca sajaDialog
.isDestroyed()
tidak tersedia, tetapi untuk tujuan praktis bukankah sama saja dengan menggunakan try / catch selalu?Saya mungkin punya solusi.
Sedang mengalami masalah yang sama, di mana saya memuat banyak item (melalui sistem file) ke
ListView
melaluiAsyncTask
. SeandainyaonPreExecute()
firing upProgressDialog
, dan kemudian keduanyaonPostExecute()
danonCancelled()
(dipanggil ketika tugas dibatalkan secara eksplisit melaluiAsyncTask.cancel()
) menutup via.cancel()
.Mendapat kesalahan "java.lang.IllegalArgumentException yang sama: View tidak terlampir ke window manager" ketika saya mematikan dialog dalam
onCancelled()
metodeAsyncTask
(saya pernah melihat ini dilakukan di aplikasi Shelves yang sangat baik ).Solusinya adalah membuat bidang publik di
AsyncTask
yang berisiProgressDialog
:Lalu,
onDestroy()
ketika saya membatalkanAsyncTask
, saya juga dapat mematikan dialog terkait melalui:Memanggil
AsyncTask.cancel()
memicu TIDAKonCancelled()
diAsyncTask
, tetapi untuk beberapa alasan pada saat metode dipanggil, tampilan telah dihancurkan dan dengan demikian membatalkan dialog gagal.sumber
Inilah solusi yang tepat untuk menyelesaikan masalah ini:
Alih-alih secara membabi buta menangkap semua pengecualian, solusi ini membahas akar masalah: mencoba mengabaikan dialog ketika aktivitas yang digunakan untuk menginisialisasi dialog telah selesai. Bekerja pada Nexus 4 saya menjalankan KitKat, tetapi harus bekerja untuk semua versi Android.
sumber
isDestroyed
membutuhkan API 17+Saya setuju pendapat 'Damjan'.
jika Anda menggunakan banyak dialog, tutup semua dialog di onDestroy () atau onStop ().
maka Anda mungkin dapat mengurangi frekuensi 'java.lang.IllegalArgumentException: Tampilan tidak terlampir pada window manager' terjadi.
tetapi sedikit melebihi ...
untuk membuatnya lebih jelas, Anda mencegah untuk menampilkan dialog apa pun setelah onDestroy dipanggil.
saya tidak menggunakan seperti di bawah ini. tapi jelas.
semoga berhasil!
sumber
Gunakan ini.
sumber
if
dalam kasus seperti ini,&&
operator Java memiliki evaluasi malas (juga disebut hubungan arus pendek), yang berarti operan ke-2 tidak dievaluasi jika yang pertama dievaluasifalse
(yang berarti hasil dari bagaimanapun&&
akan selalufalse
, karenanya evaluasi "malas"). Demikian pula||
tidak akan mengevaluasi operan ke-2 jika yang pertama mengevaluasitrue
. Catatan: operator&
dan|
tidak memiliki perilaku ini dan dengan demikian selalu mengevaluasi kedua operan.Saya memiliki masalah yang sama, Anda dapat menyelesaikannya dengan:
sumber
Saya pikir kode Anda benar tidak seperti jawaban lain yang disarankan. onPostExecute akan berjalan di utas UI. Itulah inti dari AsyncTask - Anda tidak perlu khawatir tentang memanggil runOnUiThread atau berurusan dengan penangan. Lebih lanjut, menurut dokumen, dismiss () dapat dengan aman dipanggil dari utas apa pun (tidak yakin mereka membuat pengecualian ini).
Mungkin ini masalah waktu ketika dialog.dismiss () dipanggil setelah aktivitas tidak lagi ditampilkan?
Bagaimana dengan pengujian apa yang terjadi jika Anda mengomentari setOnCancelListener dan kemudian keluar dari aktivitas saat tugas latar belakang sedang berjalan? Maka onPostExecute Anda akan mencoba untuk mengabaikan dialog yang sudah diberhentikan. Jika aplikasi macet, Anda mungkin dapat memeriksa apakah dialog terbuka sebelum mengabaikannya.
Saya mengalami masalah yang sama persis sehingga saya akan mencobanya dalam kode.
sumber
alex,
Saya bisa saja salah di sini, tetapi saya curiga bahwa banyak telepon 'di alam bebas' memiliki bug yang menyebabkan mereka beralih orientasi pada aplikasi yang ditandai sebagai berorientasi statis. Ini terjadi cukup banyak pada telepon pribadi saya, dan pada banyak telepon percobaan yang digunakan oleh kelompok kami (termasuk droid, n1, g1, pahlawan). Biasanya aplikasi yang ditandai sebagai berorientasi statis (mungkin secara vertikal) akan meletakkan dirinya sendiri selama satu atau dua detik menggunakan orientasi horisontal, dan kemudian segera beralih kembali. Hasil akhirnya adalah meskipun Anda tidak ingin aplikasi beralih orientasi, Anda harus siap untuk melakukannya. Saya tidak tahu dalam kondisi persis bagaimana perilaku ini dapat direproduksi, saya tidak tahu apakah itu khusus untuk versi Android. Yang saya tahu adalah bahwa saya telah melihat itu terjadi berkali-kali :(
Saya akan merekomendasikan menggunakan solusi yang disediakan dalam tautan yang Anda posting yang menyarankan mengganti metode Activity onCreateDialog dan membiarkan OS Android mengelola siklus hidup Dialog Anda. Sepertinya saya meskipun Anda tidak ingin aktivitas Anda beralih orientasi, itu beralih orientasi di suatu tempat. Anda dapat mencoba melacak metode yang akan selalu mencegah peralihan orientasi, tetapi saya mencoba untuk memberi tahu Anda bahwa saya secara pribadi tidak percaya ada cara yang sangat mudah yang bekerja pada semua ponsel Android saat ini di pasar.
sumber
Yang paling berhasil bagi saya adalah memverifikasi apakah Kegiatan tidak selesai.
sumber
Baru saja mendapat masalah yang sama. Perbaiki untuk API level 13 atau lebih tinggi.
Dari Android docs:
Jadi saya telah mengubah manifes saya menjadi ini:
Dan sekarang berfungsi dengan baik. Aktivitas tidak diciptakan kembali ketika saya memutar telepon, melanjutkan dialog dan tampilan tetap sama. Tidak ada kesalahan untuk saya.
sumber
Pertama-tama lakukan penanganan kesalahan di mana pun Anda mencoba mengabaikan dialog.
Jika itu tidak diperbaiki maka abaikan di onStop () Method of the activity.
sumber
Saya memiliki masalah yang sama ketika menggunakan tombol untuk menyinkronkan daftar dari server: 1) Saya klik tombol 2) Dialog progres muncul saat memuat daftar dari server 3) Saya mengubah perangkat ke orientasi lain 4) java.lang .IllegalArgumentException: Tampilan tidak terlampir pada window manager pada postExecute () dari AsyncTask selama progress.dismiss ().
Ketika saya mencoba memperbaikinya, saya menemukan bahwa meskipun masalah tidak terjadi, daftar saya tidak menampilkan semua item.
Saya pikir apa yang saya inginkan adalah agar AsyncTask menyelesaikan (dan mengabaikan dialog) sebelum aktivitas beign dihancurkan, jadi saya membuat objek asynctask sebagai atribut dan menimpa metode onDestroy ().
Jika asynctask membutuhkan banyak waktu, pengguna mungkin akan merasa bahwa perangkatnya lambat, tetapi saya pikir itulah harga yang ia bayar untuk mencoba mengubah orientasi perangkat saat dialog progres muncul. Dan bahkan jika itu membutuhkan waktu aplikasi tidak crash.
sumber
sumber
Kode di bawah ini berfungsi untuk Anda, dan berfungsi dengan baik untuk saya:
Jangan mendefinisikan pandangan Anda secara global jika Anda menyebutnya dari layanan latar belakang.
sumber