Pencere belirteci eklenemiyor android.os.BinderProxy geçerli değil; faaliyetin devam ediyor mu


116

Facebook API üzerinden Facebook'a bağlanmaya çalışıyorum, şu örneği takip ediyorum: https://github.com/facebook/facebook-android-sdk/tree/master/examples/simple

Her şey yolunda, ancak bazı kodları düzenlemeye çalıştığımda, yani giriş başarılı olduktan sonra iletişim kutusu gönderi mesajını şu şekilde görüntülemek istiyorum:

public void onAuthSucceed() {
        mText.setText("You have logged in! ");   
        //This is the code to call the post message dialog.                     
        mFacebook.dialog(Example.this, "feed",new SampleDialogListener());   
    }

Bu hatayı logcat'te alıyorum:

03-02 13:32:08.629: E/AndroidRuntime(14991): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@405180f8 is not valid; is your activity running?
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.view.ViewRoot.setView(ViewRoot.java:532)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.view.Window$LocalWindowManager.addView(Window.java:424)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.app.Dialog.show(Dialog.java:241)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.Facebook.dialog(Facebook.java:780)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.Facebook.dialog(Facebook.java:737)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.Example$SampleAuthListener.onAuthSucceed(Example.java:113)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.SessionEvents.onLoginSuccess(SessionEvents.java:78)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.Example$LoginDialogListener.onComplete(Example.java:88)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.Facebook$1.onComplete(Facebook.java:320)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.FbDialog$FbWebViewClient.shouldOverrideUrlLoading(FbDialog.java:144)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:218)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:337)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.os.Looper.loop(Looper.java:130)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.app.ActivityThread.main(ActivityThread.java:3687)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at java.lang.reflect.Method.invokeNative(Native Method)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at java.lang.reflect.Method.invoke(Method.java:507)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at dalvik.system.NativeStart.main(Native Method)

Herhangi bir fikir?



1
Aşağıdaki yanıtı kontrol edin. Doğru olarak işaretledim :)
Han Tran

Yanıtı işaretlemiş olmanız, bunun yinelenen bir soru olduğu gerçeğini değiştirmez. Önce diğeri soruldu ve özdeş bir yanıtı olan özdeş bir konudur.
bsara

1
Sorumun 2 yıl önce olduğunu gördün mü?
Han Tran

1
Öyleyse başkaları gibi görün Moderatör hata yaptı ama siz :)) Anw, teşekkürler!
Han Tran

Yanıtlar:


127

Bu, artık mevcut olmayan bir bağlam için iletişim kutusunu gösterirken ortaya çıkabilir. Yaygın bir durum - 'diyaloğu göster' işlemi eşzamansız bir işlemden sonraysa ve bu işlem sırasında orijinal etkinlik (yani, iletişim kutusunun üst öğesi) yok edilir. İyi bir açıklama için bu blog gönderisine ve yorumlara bakın:

http://dimitar.me/android-displaying-dialogs-from-background-threads/

Yukarıdaki yığın izlemeden, facebook kitaplığının kimlik doğrulama işlemini eşzamansız olarak kapattığı ve bu senaryoyu kolayca oluşturabilecek bir İşleyici - Geri Çağırma mekanizmasına (bir dinleyicide çağrılan onComplete) sahip olduğunuz görülmektedir.

Bunun uygulamamda bildirildiğini gördüğümde, oldukça nadir ve blog gönderisindeki deneyimle eşleşiyor. Etkinlik için bir şeyler ters gitti / AsyncTask'ın çalışması sırasında yok edildi. Değişikliğinizin her seferinde bununla nasıl sonuçlanacağını bilmiyorum, ama belki de kodunuz yürütüldüğünde her zaman yok olan iletişim kutusu bağlamı olarak bir Etkinliğe atıfta bulunuyorsunuz?

Ayrıca, etkinliğinizin çalışıp çalışmadığını anlamanın en iyi yolunun bu olup olmadığından emin olmasam da, bunu yapmanın bir yöntemi için şu yanıta bakın:

Aktivitenin aktif olup olmadığını kontrol edin


3
Çağırarak değil dialog.show()sorun çözer ama hala benim iletişim göstermek edebilmek için kendisine etrafında çalışma nedir?
natsumiyu

Benim için, Fragment.getContext()21'in üzerindeki API'ler için çalışan arıyorum . Ama Lollipop'ta çöküyor
TheRealChx101

158

Bazı uygulamalarımdan arada bir bu hatanın bildirildiğini görüyordum ve işte benim için çözen şey:

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

Diğer tüm yanıtlar, koşu aktiviteleri listesini yinelemek gibi garip şeyler yapıyor gibi görünüyor, ancak bu çok daha basit ve hile yapıyor gibi görünüyor.


6
sorunu çözmez,
çökmeyi

6
Sadece kontrol etmeniz gerektiğini unutmayın, yoksa context instanceof Activitybir Exception!
FtheBuilder

3
veya bağlam yerine getActivity (). isFinishing () kullanabilirsiniz
Nikita Axyonov

API-23 kullanıyorum. Bunu, AppCompatActivity'yi genişleten MainActivity'de kullanmaya çalıştığımda. Bana neden olduğu gibi bir hata gösteriyor: java.lang.ClassCastException: com.creativeapp.hindihdvideosongs.AppController com.creativeapp.hindihdvideosongs.MainActivity.onCreate (MainActivity.java:145) AppController'da android.app.Activity'ye dönüştürülemiyor AndroidMenifest'ime eklendi
pavel

Herhangi bir diyalog kullanmıyorum ve bu hatayı alıyorum.
Abdul Waheed

11

basit bir çözüm, istisnayı yakalamaktır:

try {
        alertDialog.show()
    }
catch (WindowManager.BadTokenException e) {
        //use a log message
    }

Zaman uyumsuz işlemleri yönetmeniz gerektiğinde ve iletişim kutusunu göstermek istediğinizde etkinliğin devam edip etmediğinden emin olmadığınız zaman zarif değildir, ancak bazen kolaydır.


1
çok çirkin ama çok güzel!
Rahul Tiwari

8
  • Benim durumumda sorun, onPostExecuteAsyncTask'ta iletişim kutusunu açmaya / göstermeye çalıştığım için oluştu

  • Ancak yanlış bir yöntem showing dialogveya Ui değişiyor onPostExecute.

  • Bunun için, aktivitenin aktif olup olmadığını kontrol etmemiz gerekir Örn: !isFinishing() eğer aktivite bitmemişse sadece iletişim kutumuzu veya kullanıcı arayüzümüzü gösterebiliriz.

    @Override
    protected void onPostExecute(String response_str) {
    
       getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (!((Activity) mContext).isFinishing()) {
                            try {
                                ShowAgilDialog();
                            } catch (WindowManager.BadTokenException e) {
                                Log.e("WindowManagerBad ", e.toString());
                            }
                        }
                    }
                });
    }

1

Ben de tamamen aynı sorunla karşılaştım. Çağrı '(!isFinishing())', çökmeyi engelledi, ancak 'uyarı' mesajını görüntüleyemedi.

Ardından uyarının görüntülendiği 'statik' işlevini çağırmayı denedim . Bundan sonra, herhangi bir kilitlenme olmadı ve mesaj da görüntüleniyor.

Örneğin:

public static void connect_failure() {      
        Log.i(FW_UPD_APP, "Connect failed");

        new AlertDialog.Builder(MyActivity)
        .setTitle("Title")
        .setMessage("Message")
        .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) { 
                  //do nothing
            }
         })
        .setIcon(R.drawable.the_image).show();      
    }

1

İş parçacığını çalıştırdıktan sonra, bu iki kod satırını ekleyin ve bu sorunu çözecektir.

Looper.loop();
Looper.myLooper().quit();

1

Başka bir geliştirici kullanım durumu: WindowManagerveya getWindow()çağrılırsa onCreate()veya onStart()veya onResume(), a BadTokenExceptionatılır. Görünüm hazırlanıp eklenene kadar beklemeniz gerekecek.

Çözmek için kodu taşımak onAttachedToWindow(). Kalıcı bir çözüm olmayabilir, ancak test edebildiğim kadarıyla her zaman işe yaradı.

Benim durumumda, etkinlik görünür hale geldiğinde ekran parlaklığını artırma ihtiyacı vardı. Hattı getWindow().getAttributes().screenBrightnessiçinde onResume()bir istisna ile sonuçlanmıştır. Kodun çalışması için taşınması onAttachedToWindow().


0

Benim staticiçin Window, bu yöntemlerle ilgili özelliklere sahip olduğum için DialogHelper.class yöntemlerinde (iletişim kutusunu oluşturmak ve gizlemek için yanıtlama) özelliği kaldırarak düzeltildi.


0

Bağımlılık Hizmetleri altında yukarıdakilerin hiçbiri bana yardımcı olmadı, aşağıdaki gibi yaptım:

    class Static_Toast_Android
    {
        private static Context _context
        {
            get { return Android.App.Application.Context; }
        }
        public static void StaticDisplayToast(string message)
        {
            Toast.MakeText(_context, message, ToastLength.Long).Show();
        }
    }
    public class Toast_Android : IToast
    {

        public void DisplayToast(string message)
        {
            Static_Toast_Android.StaticDisplayToast(message);
        }
    }

"Double-class" kullanmalıyım çünkü bir arayüz statik olamaz. L-


0

Pencere eklenemiyor - simge geçerli değil; faaliyetin devam ediyor mu

Bu kilitlenme genellikle uygulamanızın daha önce tamamlanmış bir Etkinliği bağlam olarak kullanarak bir iletişim kutusu görüntülemeye çalışmasından kaynaklanır. Örneğin, bir Etkinlik, tamamlandığında bir iletişim kutusu görüntülemeye çalışan bir AsyncTask'ı tetiklerse, ancak kullanıcı görev tamamlanmadan önce Etkinlik'ten geri dönerse bu gerçekleşebilir.

Dış kaynaklar

Android - Arka Plandaki Konulardan İletişim Kutularını Görüntüleme

Hata: BinderProxy @ 45d459c0 geçerli değil; faaliyetin devam ediyor mu


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.