it-swarm-id.com

Kesalahan: BinderProxy @ 45d459c0 tidak valid; Apakah aktivitas Anda berjalan?

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 [email protected] 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)
117
VISHAL DAGA

Ini kemungkinan besar terjadi karena Anda mencoba 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 yang lain ketika mencoba menampilkan dialog. Inilah yang memecahkannya untuk saya:

if(!((Activity) context).isFinishing())
{
    //show dialog
}

Saya telah menggunakan ini untuk mengatasi masalah pada versi Android yang lebih lama selama beberapa tahun sekarang, dan belum melihat crash sejak itu.

293
DiscDev

periksa tautan ini:
.__ Android - Menampilkan Dialog Dari Latar Belakang

19
Naveen

Saya menghadapi masalah yang sama dan menggunakan kode yang diusulkan oleh DiscDev di atas dengan perubahan kecil sebagai berikut:

if (!MainActivity.this.isFinishing()){
    alertDialog.show();
}
8
Hamza Polat

Cara mengatasinya cukup sederhana. Cukup uji apakah Kegiatan sedang melewati tahap akhir sebelum menampilkan Dialog:

  private Handler myHandler = new Handler() {
  @Override
  public void handleMessage(Message msg) {
    switch (msg.what) {
      case DISPLAY_DLG:
        if (!isFinishing()) {
        showDialog(MY_DIALOG);
        }
      break;
    }
  }
};

lihat lebih lanjut di sini

1
Diego Venâncio

Dalam kasus saya, masalahnya adalah bahwa Context disimpan sebagai referensi lemah di kelas yang meluas Handler. Kemudian saya melewati Messenger, yang membungkus pawang, melalui Intent menjadi Service. Saya melakukan ini setiap kali aktivitas muncul di layar dalam metode onResume().

Jadi seperti yang Anda pahami, Messenger diserialkan bersama dengan bidangnya (termasuk konteks), karena itu adalah satu-satunya cara untuk melewatkan objek menggunakan Intent - untuk membuat serialisasi. Pada saat Messenger dilewatkan ke layanan, aktivitas itu sendiri masih belum siap untuk menampilkan dialog seperti di negara lain (dikatakan padaResume (), yang benar-benar berbeda dari ketika aktivitas sudah ada di layar). Jadi ketika messenger dideserialisasi, konteksnya masih pada status resume, sementara aktivitas sebenarnya sudah ada di layar. Selain itu, deserialisasi mengalokasikan memori untuk objek baru, yang sama sekali berbeda dari yang asli.

Solusinya adalah hanya mengikat ke layanan setiap kali Anda membutuhkannya dan mengembalikan binder yang memiliki metode seperti 'setMessenger (Messenger messenger)' dan menyebutnya, ketika Anda diikat ke layanan.

1
Turkhan Badalov

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:

class DialogManager {

        fun showAlertDialog(weakActivity: WeakReference<Activity>) {
            val wActivity = weakActivity.get()
            wActivity?.let {
                val builder = AlertDialog.Builder(wActivity, R.style.MyDialogTheme)
                val inflater = wActivity.layoutInflater
                val dialogView = inflater.inflate(R.layout.alert_dialog_info, null)
                builder.setView(dialogView)

                // Set your dialog properties here. E.g. builder.setTitle("MyTitle")

                builder.create().show()
            }
         }

}

Dan Anda menampilkan dialog seperti ini:

 val dialogManager = DialogManager()
 dialogManager.showAlertDialog(WeakReference<Activity>([email protected]))

Jika Anda ingin menjadi super-duper, lindungi dari crash. Alih-alih menggunakan builder.create().show():

val dialog = builder.create()
safeShow(weakActivity, dialog)

Ini adalah metode safeShow:

private fun safeShow(weakActivity: WeakReference<Activity>, dialog: AlertDialog?) {
        val wActivity = weakActivity.get()
        if (null != dialog && null != wActivity) {
            // Api >=17
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                if (!dialog.isShowing && !(wActivity).isFinishing && !wActivity.isDestroyed) {
                    try {
                        dialog.show()
                    } catch (e: Exception) {
                        //Log exception
                    }
                }
            } else {

                // Api < 17. Unfortunately cannot check for isDestroyed()
                if (!dialog.isShowing && !(wActivity).isFinishing) {
                    try {
                        dialog.show()
                    } catch (e: Exception) {
                        //Log exception
                    }
                }
            }
        }
    }

Ini adalah metode serupa yang dapat Anda gunakan untuk mengabaikan dialog dengan aman:

private fun safeDismissAlertDialog(weakActivity: WeakReference<Activity>, dialog: AlertDialog?) {
        val wActivity = weakActivity.get()
        if (null != dialog && null != wActivity) {
            // Api >=17
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                if (dialog.isShowing && !wActivity.isFinishing && !wActivity.isDestroyed) {
                    try {
                        dialog.dismiss()
                    } catch (e: Exception) {
                        //Log exception
                    }
                }
            } else {

                // Api < 17. Unfortunately cannot check for isDestroyed()
                if (!dialog.isShowing && !(wActivity).isFinishing) {
                    try {
                        dialog.dismiss()
                    } catch (e: Exception) {
                        //Log exception
                    }
                }
            }
        }
    }
1
Ivo Stoyanov

Saya mengalami kesalahan ini ketika saya memiliki countDownTimer di aplikasi saya. Itu metode memanggil GameOver di aplikasi saya sebagai

public void onFinish() {
     GameOver();
}

tetapi 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 membatalkan countDownTimer sehingga setelah waktunya habis, dialog muncul lagi. Atau jatuh dengan kesalahan di atas karena suatu alasan.

1
erdomester

Kesalahan ini terjadi ketika Anda menampilkan dialog untuk konteks yang tidak ada lagi. sebelum memanggil .show() periksa aktivitas/konteks isFinishing()

if (!(context instanceof Activity && ((Activity) context).isFinishing())) {
    alert.show();
}
0
akhilesh0707

Dalam kasus saya, saya lupa berkomentar selesai ();

0
Surbhit Rao

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:

if(!((Activity) context).isFinishing())
{
    //show dialog
}

bagaimana dengan ini?

 YourDialog mDialog = new YourDialog();
 mDialog1.show(((AppCompatActivity) mContext).getSupportFragmentManager(), "OrderbookDialog");
                        }

jadi daripada hanya memeriksa apakah aman atau tidak untuk menampilkan dialog, saya pikir itu jauh lebih aman jika kita hanya membuat instance baru untuk menampilkan dialog.

Seperti saya, Dalam kasus saya, saya mencoba membuat satu instance (dari Fragment onCreate ) dan memanggil instance dari dialog tersebut di konten lain dari adapterList dan ini akan menghasilkan "apakah aktivitas Anda berjalan" - error . Saya pikir itu karena saya baru saja membuat satu instance (dari onCreate) dan kemudian dihancurkan, jadi ketika saya mencoba memanggilnya dari adapterList 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 instance)

0
Dan