विंडो जोड़ने में असमर्थ - टोकन android.os.BinderProxy मान्य नहीं है; क्या आपकी गतिविधि चल रही है?


116

मैं फेसबुक के माध्यम से फेसबुक एपीआई से जुड़ने की कोशिश करता हूं, मैं इस उदाहरण का अनुसरण करता हूं: https://github.com/facebook/facebook-android-sdk/tree/master/examples/simple

सब कुछ ठीक है, लेकिन जब मैं कुछ कोड को संपादित करने की कोशिश करता हूं, तो मेरा मतलब है कि लॉगिन सफल होने के बाद मैं संवाद पोस्ट संदेश प्रदर्शित करना चाहता हूं:

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());   
    }

मुझे यह त्रुटि logcat में प्राप्त होती है:

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)

कोई उपाय?



1
नीचे दिए गए उत्तर की जाँच करें। मैंने इसे सही किया है :)
हान ट्रान

सिर्फ इसलिए कि आपने उत्तर को चिह्नित किया है, इस तथ्य को नहीं बदलता है कि यह एक डुप्लिकेट प्रश्न है। दूसरे से पहले पूछा गया था और एक समान रूप से समान जवाब के साथ एक समान मुद्दा है।
bsara

1
क्या आपने देखा कि मेरा प्रश्न 2 साल पहले का है?
हान ट्रान

1
तो दूसरों की तरह देखो मॉडरेटर की गलती है लेकिन आप :)) धन्यवाद, धन्यवाद!
हान ट्रैन

जवाबों:


127

यह तब हो सकता है जब आप किसी संदर्भ के लिए संवाद दिखा रहे हैं जो अब मौजूद नहीं है। एक सामान्य मामला - यदि 'शो डायलॉग' ऑपरेशन एक एसिंक्रोनस ऑपरेशन के बाद है, और उस ऑपरेशन के दौरान मूल गतिविधि (जो आपके संवाद का जनक होना है) नष्ट हो जाती है। अच्छे विवरण के लिए, इस ब्लॉग पोस्ट और टिप्पणियों को देखें:

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

ऊपर दिए गए स्टैक ट्रेस से, ऐसा प्रतीत होता है कि facebook लाइब्रेरी एसिंक्रोनस रूप से ऑरिजनल ऑपरेशन को बंद कर देती है, और आपके पास एक हैंडलर - कॉलबैक मैकेनिज्म (एक श्रोता पर कहा जाने वाला) जो इस परिदृश्य को आसानी से बना सकता है।

जब मैंने इसे अपने ऐप में रिपोर्ट किया है, तो यह बहुत दुर्लभ है और ब्लॉग पोस्ट में अनुभव से मेल खाता है। गतिविधि के लिए कुछ गलत हो गया / यह AsyncTask के काम के दौरान नष्ट हो गया। मैं नहीं जानता कि हर बार आपका संशोधन कैसे हो सकता है, लेकिन शायद आप किसी गतिविधि को उस संवाद के संदर्भ के रूप में संदर्भित कर रहे हैं जो आपके कोड के निष्पादित होने तक हमेशा नष्ट हो जाता है?

इसके अलावा, जब मुझे यकीन नहीं है कि यह बताने का सबसे अच्छा तरीका है कि क्या आपकी गतिविधि चल रही है, तो ऐसा करने के एक तरीके के लिए यह उत्तर देखें:

जांचें कि क्या गतिविधि सक्रिय है


3
कॉलिंग dialog.show()समस्या को हल नहीं करती है, लेकिन फिर भी मेरे संवाद दिखाने में सक्षम होने के लिए इसके आसपास क्या काम है?
natsumiyu

मेरे लिए, मैं कॉल कर रहा हूं Fragment.getContext(), जो 21 से ऊपर एपीआई के लिए काम करता है। लेकिन लॉलीपॉप पर यह दुर्घटनाग्रस्त हो जाता है
TheRealChx101

158

मैं अपने कुछ ऐप्स से थोड़ी देर में एक बार रिपोर्ट की गई इस त्रुटि को देख रहा था, और यहाँ यह मेरे लिए क्या हल है:

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

अन्य सभी जवाबों से लगता है कि यह अजीबोगरीब काम कर रहा है जैसे दौड़ने की गतिविधियों की सूची के माध्यम से पुनरावृत्ति करना, लेकिन यह बहुत सरल है और चाल को करने में लगता है।


6
यह समस्या को हल नहीं करता है, यह दुर्घटना को रोकता है और संवाद भी
दिखाता है

6
बस आपको याद रखना चाहिए कि आपको जांच करनी चाहिए context instanceof Activityया आप ए Exception!
FtheBuilder

3
या आप getActivity () का उपयोग कर सकते हैं। संदर्भ के बजाय फ़िनिशिंग ()
निकिता Axyonov

मैं एपीआई -23 का उपयोग कर रहा हूं। जब मैं अपने MainActivity में इसका उपयोग करने की कोशिश करता हूं जो AppCompatActivity को बढ़ाता है। यह मुझे एक त्रुटि दिखाता है जैसे: java.lang.ClassCastException: com.creativeapp.hindihdvideosongs.AppController को android.app पर नहीं डाला जा सकता। com। मेरी AndroidMenifest में जोड़ा
पावेल

मैं किसी भी संवाद का उपयोग नहीं कर रहा हूं और यह त्रुटि हो रही है।
अब्दुल वहीद

11

अपवाद को पकड़ने के लिए एक सरल उपाय है:

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

यह सुरुचिपूर्ण नहीं है लेकिन कभी-कभी आसान होता है जब आपको async ऑपरेशंस को मैनेज करना होता है और आपको यकीन नहीं होता है कि जब आप डायलॉग दिखाना चाहते हैं, तो wether एक्टिविटी ऊपर है या नहीं।


1
बहुत बदसूरत अभी तक बहुत सुंदर!
राहुल तिवारी

8
  • मेरे मामले में onPostExecuteAsyncTask में डायलॉग बॉक्स खोलने / दिखाने की कोशिश करने के कारण यह समस्या आई है

  • हालाँकि इसकी showing dialogया यूआई की एक गलत पद्धति में परिवर्तन होता है onPostExecute

  • उसके लिए, हमें यह जाँचने की ज़रूरत है कि गतिविधि सक्रिय है जैसे:, !isFinishing() यदि गतिविधि समाप्त नहीं हुई है, तो केवल हमारे संवाद बॉक्स या रुई को दिखाने में सक्षम है।

    @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

मैंने ठीक उसी मुद्दे का सामना किया। कॉलिंग '(!isFinishing())'ने दुर्घटना को रोका, लेकिन यह 'अलर्ट' संदेश प्रदर्शित नहीं कर सका।

फिर मैंने कॉलिंग फंक्शन को 'स्टैटिक' बनाने की कोशिश की , जहाँ अलर्ट प्रदर्शित होता है। उसके बाद, कोई दुर्घटना नहीं हुई और संदेश भी प्रदर्शित हो रहा है।

पूर्व के लिए:

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

धागे को निष्पादित करने के बाद, कोड की इन दो लाइन को जोड़ें, और इससे समस्या हल हो जाएगी।

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

1

एक और डेवलपर उपयोग के मामले: अगर WindowManagerया getWindow()पर बुलाया जा रहा है onCreate()या onStart()या onResume(), एक BadTokenExceptionफेंक दिया है। जब तक दृश्य तैयार और संलग्न नहीं किया जाता है, तब तक आपको इंतजार करना होगा।

कोड को onAttachedToWindow()हल करना। यह एक स्थायी समाधान नहीं हो सकता है, लेकिन जितना मैं परीक्षण कर सकता था, उसने हमेशा काम किया।

मेरे मामले में, गतिविधि दिखाई देने पर स्क्रीन की चमक बढ़ाने की आवश्यकता थी। लाइन getWindow().getAttributes().screenBrightnessमें onResume()एक अपवाद में हुई। onAttachedToWindow()काम करने के लिए कोड बढ़ रहा है ।


0

मेरे लिए यह staticडायलॉग हेल्पर.क्लास विधियों (डायलॉग बनाने और छिपाने के लिए प्रतिक्रियाशील) में संपत्ति को हटाकर तय किया गया था , क्योंकि मेरे पास Windowउन तरीकों से संबंधित गुण हैं


0

निर्भरता सेवाओं के तहत उपरोक्त में से कुछ भी मेरी मदद नहीं की, मैं नीचे की तरह कर रहा हूँ:

    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);
        }
    }

मुझे "डबल-क्लास" का उपयोग करना चाहिए क्योंकि एक इंटरफ़ेस स्थिर नहीं हो सकता है। एल


0

विंडो जोड़ने में असमर्थ - टोकन मान्य नहीं है; क्या आपकी गतिविधि चल रही है?

यह क्रैश आमतौर पर आपके ऐप द्वारा एक संदर्भ के रूप में पहले से तैयार गतिविधि का उपयोग करके एक संवाद प्रदर्शित करने की कोशिश के कारण होता है। उदाहरण के लिए, यह तब हो सकता है जब कोई गतिविधि AsyncTask को ट्रिगर करती है जो समाप्त होने पर एक संवाद प्रदर्शित करने की कोशिश करती है, लेकिन उपयोगकर्ता कार्य पूरा होने से पहले गतिविधि से वापस नेविगेट करता है।

बाहरी संसाधन

Android - पृष्ठभूमि थ्रेड्स से डायलॉग प्रदर्शित करना

त्रुटि: BinderProxy @ 45d459c0 मान्य नहीं है; क्या आपकी गतिविधि चल रही है?


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.