Apa kesalahan ini, dan mengapa hal 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)
Anda're mencoba untuk menampilkan Dialog setelah anda've keluar suatu Kegiatan.
[Sunting / SUNTING sumber]
Pertanyaan ini adalah salah satu dari top pencarian di google untuk pengembang android, oleh karena itu untuk Menambahkan beberapa poin penting dari komentar, yang mungkin akan lebih bermanfaat untuk masa depan penyidik tanpa di kedalaman komentar percakapan.
Jawaban 1 :
Anda're mencoba untuk menampilkan Dialog setelah anda've keluar suatu Kegiatan.
Jawaban 2
kesalahan Ini dapat sedikit menyesatkan dalam beberapa keadaan (meskipun jawabannya adalah masih benar-benar akurat) - yaitu, dalam kasus saya yang unhandled Pengecualian dilemparkan dalam sebuah AsyncTask, yang menyebabkan Aktivitas untuk shutdown, maka terbuka progressdialog ini disebabkan Pengecualian.. jadi 'nyata' pengecualian adalah sedikit lebih awal dalam log
Jawaban 3
Panggilan memberhentikan() pada Dialog instance anda dibuat sebelum keluar anda , Kegiatan, misalnya di onPause() atau onDestroy()
Jika anda menggunakan AsyncTask
, mungkin itu pesan log dapat menipu. Jika anda melihat di log anda, anda mungkin menemukan kesalahan lain, mungkin salah satu di doInBackground()
metode anda AsyncTask
, yang membuat anda saat ini Aktivitas
untuk meledakkan, dan dengan demikian setelah AsyncTask
datang kembali.. yah, anda tahu sisanya. Beberapa pengguna lain yang sudah dijelaskan bahwa di sini :-)
Anda bisa mendapatkan pengecualian ini hanya dengan sederhana/kesalahan bodoh, dengan (misalnya) sengaja memanggil finish()
setelah ditampilkan sebuah AlertDialog
, jika anda melewatkan istirahat sebut pernyataan dalam pernyataan switch...
@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;
}
}
Tombol selesai()
metode akan menutup Aktivitas
, tapi AlertDialog
masih menampilkan!
Jadi, ketika anda're menatap tajam pada kode, mencari buruk threading masalah atau kompleks coding dan seperti itu, don't melupakan hutan untuk pohon-pohon. Kadang-kadang hal ini dapat sesuatu yang sederhana dan bodoh seperti hilang pernyataan break. :)
Masalah ini muncul ketika mencoba untuk menampilkan Dialog setelah anda've keluar suatu Kegiatan.
Aku hanya memecahkan masalah ini hanya dengan menuliskan kode berikut:
@Override
public void onDestroy(){
super.onDestroy();
if ( progressDialog!=null && progressDialog.isShowing() ){
progressDialog.cancel();
}
}
Pada dasarnya, dari yang kelas anda mulai progressDialog, menimpa onDestroy metode dan lakukan cara ini. Itu soal "Kegiatan telah bocor jendela" masalah.
Jawaban untuk pertanyaan ini adalah semua benar, tapi sedikit membingungkan bagi saya untuk benar-benar memahami mengapa. Setelah bermain-main sekitar 2 jam alasan untuk kesalahan ini (dalam kasus saya) memukul saya:
Anda sudah tahu, dari membaca jawaban yang lain, yang memiliki X telah bocor jendela DecorView@d9e6131[]
kesalahan berarti dialog terbuka ketika aplikasi ditutup. Tapi kenapa?
Bisa jadi, bahwa aplikasi anda jatuh untuk beberapa alasan lain saat dialog terbuka
Ini menyebabkan anda menutup aplikasi karena beberapa bug dalam kode anda, yang mengarah pada dialog terbuka yang masih tersisa pada saat yang sama sebagai aplikasi anda ditutup karena kesalahan lainnya.
Jadi, melihat melalui logis anda. Memecahkan kesalahan pertama, dan kemudian yang kedua kesalahan akan memecahkan sendiri
Salah satu penyebab kesalahan lain, yang menyebabkan yang lain, seperti kartu DOMINO!
Saya baru-baru ini menghadapi masalah yang sama.
Alasan di balik masalah ini adalah bahwa kegiatan ditutup sebelum dialog diberhentikan. Ada berbagai alasan di atas terjadi. Orang-orang yang disebutkan dalam tulisan di atas juga benar.
Saya masuk ke sebuah situasi, karena di thread, saya memanggil fungsi yang melemparkan pengecualian. Karena dari jendela yang sedang diberhentikan dan karenanya pengecualian.
Saya sama dengan mengaburkan pesan kesalahan dan tidak tahu mengapa. Diberikan petunjuk dari jawaban sebelumnya, saya berubah saya non-GUI panggilan untuk mDialog.finish() untuk menjadi mDialog.mengabaikan() dan kesalahan menghilang. Ini wasn't mempengaruhi saya widget's perilaku tapi itu membingungkan dan bisa juga telah lesu penting kebocoran memori.
Saya mendapatkan ini log di aplikasi pemutar video. Pesan-pesan ini dilemparkan sementara video pemain ditutup. Menariknya, saya digunakan untuk mendapatkan log ini setelah dalam beberapa berjalan secara acak. Juga aplikasi saya tidak terlibat dalam setiap progressdialog
. Akhirnya, saya mendapat sekitar masalah ini dengan di bawah ini implementasi.
@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();
}
Menimpa OnPause
dengan panggilan mVideoView.pause()
dan set visibility
untuk PERGI
. Cara ini saya bisa menyelesaikan "Kegiatan telah bocor jendela
" log error.
Saya sedang mengalami masalah yang sama dan menemukan halaman ini, dan sementara situasi berbeda aku disebut finish
dari sebuah jika
blok sebelum ditetapkan kotak peringatan.
Jadi, hanya memanggil mengabaikan
tidak't bekerja (karena belum't telah dibuat belum) tapi setelah membaca Alex Volovoy's menjawab dan menyadari itu adalah kotak peringatan yang menyebabkan hal itu. Saya mencoba untuk menambahkan pernyataan kembali tepat setelah selesai di dalam bahwa jika
block dan yang tetap masalah.
Saya pikir setelah anda bernama menyelesaikan itu semuanya berhenti dan selesai di sana, tapi itu doesn't. Hal itu tampaknya untuk pergi ke akhir blok kode itu's di kemudian selesai.
Jadi, jika anda ingin menerapkan situasi di mana kadang-kadang itu'll selesai sebelum melakukan beberapa kode yang anda lakukan harus menempatkan pernyataan kembali tepat setelah selesai atau'll terus berjalan dan bertindak seperti menyelesaikan disebut pada akhir blok kode tidak di mana anda menyebutnya. Yang adalah mengapa saya mendapatkan semua orang-orang yang aneh kesalahan.
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 don't menempatkan kembali tepat setelah aku menelepon selesai di sana, itu akan bertindak sebagai jika anda memiliki yang disebut itu setelah waspada.show();
dan karena itu akan mengatakan bahwa jendela yang dibocorkan oleh finishing hanya setelah anda membuat dialog yang muncul, meskipun itu's tidak terjadi, itu masih berpikir itu adalah.
Saya pikir saya'd tambahkan ini sebagai berikut ini menunjukkan menyelesaikan perintah bertindak secara berbeda maka saya pikir hal itu dan saya'd kira ada orang lain yang berpikir sama seperti yang saya lakukan sebelum saya menemukan ini.
Ini bukan jawaban untuk pertanyaan tapi itu's relevan dengan topik.
Jika kegiatan telah didefinisikan atribut dalam Manifest
android:noHistory="true"
kemudian setelah melaksanakan onPause(), konteks dari aktivitas hilang. Jadi semua pandangan's menggunakan ini konteks mungkin memberikan kesalahan ini.
Tidak hanya mencoba untuk menunjukkan peringatan tetapi hal ini juga dapat dipanggil ketika anda menyelesaikan sebuah contoh khusus dari aktivitas dan mencoba untuk memulai aktivitas baru/layanan atau mencoba untuk menghentikannya.
Contoh:
OldActivity instance;
oncreate() {
instance=this;
}
instance.finish();
instance.startActivity(new Intent(ACTION_MAIN).setClass(instance, NewActivity.class));
Hal ini terjadi pada saya ketika saya menggunakan ProgressDialog
di AsyncTask
. Sebenarnya saya menggunakan hide()
metode onPostExecute
. Berdasarkan jawaban dari @Alex Volovoy saya perlu menggunakan memberhentikan()
dengan ProgressDialog
untuk menghapus itu di onPostExecute dan yang dilakukan.
progressDialog.hide(); // Don't use it, it gives error
progressDialog.dismiss(); // Use it
Umumnya masalah ini terjadi karena kemajuan dialog : anda dapat memecahkan masalah ini dengan menggunakan salah satu dari 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();
}
}
"Kegiatan telah bocor jendela yang awalnya menambahkan...
" kesalahan terjadi ketika anda mencoba menampilkan peringatan setelah Aktivitas
lebih efektif selesai
.
Anda memiliki dua pilihan AFAIK:
memberhentikan()
pada dialog
sebelum benar-benar keluar dari aktivitas anda.dialog
di thread yang berbeda dan berjalan di thread
(independen dari arus aktivitas
).