উইন্ডো যুক্ত করতে অক্ষম - টোকেন android.os.BenderProxy বৈধ নয়; আপনার কার্যক্রম চলছে?


116

আমি ফেসবুকের মাধ্যমে ফেসবুক এপিআইয়ের সাথে সংযোগ স্থাপনের চেষ্টা করি, আমি এই উদাহরণটি অনুসরণ করি: https://github.com/facebook/facebook-android-sdk/tree/master/example/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());   
    }

আমি লগকটে এই ত্রুটিটি পেয়েছি:

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
নীচে উত্তর চেক করুন। আমি এটি সঠিক হিসাবে চিহ্নিত করেছি :)
হান ট্রান

আপনি উত্তরটি চিহ্নিত করেছেন বলেই এটি একটি সদৃশ প্রশ্ন change অন্যটিকে প্রথমে জিজ্ঞাসা করা হয়েছিল এবং এটি মূলত অভিন্ন উত্তর সহ একটি অভিন্ন সমস্যা।
বাসারা

1
আপনি কি দেখেছেন যে আমার প্রশ্নটি 2 বছর আগের?
হান ট্রান

1
সুতরাং অন্যের মতো দেখে নিন যে মডারেটরের ভুল হয়েছে তবে আপনি :)) নতুন, ধন্যবাদ!
হান ট্রান

উত্তর:


127

আপনি যখন বিদ্যমান নেই এমন কোনও প্রসঙ্গে ডায়লগটি দেখানোর সময় এটি ঘটতে পারে। একটি সাধারণ কেস - যদি 'ডায়ালগ দেখান' অপারেশনটি অ্যাসিক্রোনাস অপারেশনের পরে হয় এবং সেই অপারেশনের সময় মূল ক্রিয়াকলাপটি (যা আপনার ডায়ালগের পিতা-মাতা হওয়ার জন্য) ধ্বংস হয়ে যায়। একটি ভাল বর্ণনার জন্য, এই ব্লগ পোস্ট এবং মন্তব্য দেখুন:

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

উপরের স্ট্যাকের ট্রেস থেকে, এটি উপস্থিত হয় যে ফেসবুক লাইব্রেরিটি অ্যাসিঙ্ক্রোনিকভাবে প্রমাণীকরণের কাজ বন্ধ করে দেয় এবং আপনার কাছে একটি হ্যান্ডলার রয়েছে - কলব্যাক মেকানিজম (শ্রোতার কাছে আহ্বান করা কমকম্ট) যা সহজেই এই দৃশ্যটি তৈরি করতে পারে।

আমি যখন আমার অ্যাপটিতে এই প্রতিবেদনটি দেখেছি তখন এটি বেশ বিরল এবং ব্লগ পোস্টের অভিজ্ঞতার সাথে মেলে। অ্যাসিঙ্কটাস্কের কাজের সময় ক্রিয়াকলাপের জন্য কিছু ভুল হয়েছিল / এটি ধ্বংস হয়ে গেছে। আমি জানি না প্রতিবার আপনার পরিবর্তনের ফলাফল কীভাবে হতে পারে, তবে সম্ভবত আপনি কোনও ক্রিয়াকলাপটিকে কথোপকথনের প্রসঙ্গ হিসাবে উল্লেখ করছেন যা আপনার কোড কার্যকর করার সময় সর্বদা ধ্বংস হয়?

এছাড়াও, যদিও আপনার কার্যকলাপটি চলছে কিনা তা জানার জন্য এটি সর্বোত্তম উপায় কিনা তা আমি নিশ্চিত নই, এমন করার একটি পদ্ধতির জন্য এই উত্তরটি দেখুন:

কার্যকলাপ সক্রিয় কিনা তা পরীক্ষা করে দেখুন


3
কল dialog.show()না করা সমস্যার সমাধান করে তবে এখনও আমার ডায়ালগটি দেখাতে সক্ষম হতে এর কাজটি কী?
নাটসুমিয়ু

আমার জন্য, আমি কল করছি Fragment.getContext(), যা 21-র উপরে API এর জন্য কাজ করে But তবে
ললিপপে

158

আমি আমার কিছু অ্যাপ্লিকেশন থেকে একবারে এই ত্রুটিটি প্রতিবেদন করা দেখছিলাম এবং এটি আমার জন্য কী সমাধান করেছে তা এখানে:

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

সেখানে থাকা অন্যান্য সমস্ত উত্তরগুলি চলমান ক্রিয়াকলাপগুলির তালিকার মাধ্যমে পুনরাবৃত্তি করার মতো অদ্ভুত কাজগুলি করছে বলে মনে হয় তবে এটি অনেক সহজ এবং কৌশলটি মনে হয়।


6
এটি সমস্যার সমাধান করে না, এটি ক্র্যাশ এবং ডায়লগ প্রদর্শনও প্রতিরোধ করে
YTerle

6
শুধু মনে রাখবেন আপনার চেক করা উচিত context instanceof Activityবা আপনি একটি পেতে পারেন Exception!
ফ্থবিল্ডার

3
অথবা আপনি প্রসঙ্গের পরিবর্তে getActivity () isফিনিশিং () ব্যবহার করতে পারেন
নিকিতা অ্যাক্সিওনভ

আমি API-23 ব্যবহার করছি। যখন আমি আমার মেইনএটিভিটিতে এটি ব্যবহার করার চেষ্টা করি যা অ্যাপকম্প্যাটঅ্যাক্টিভিটি প্রসারিত করে। এটি আমাকে এর দ্বারা সৃষ্ট যেমন: ত্রুটি দেখায়: java.lang.ClassCastException: com.creativeapp.hindihdvideosongs.appController এ android.app.Activity- এ com.creativeapp.hindihdvideosongs.MainActivity.onCreate (MainActivity.javaimarler45) অ্যাপকন্ট্রোল এ যুক্ত করা যাবে না আমার অ্যান্ড্রয়েডমিনিস্টেফ
প্যাভেল

আমি কোনও সংলাপ ব্যবহার করছি না এবং এই ত্রুটিটি পাচ্ছি।
আব্দুল ওয়াহেদ

10

একটি সহজ কাজ ব্যতিক্রম ধরা:

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

এটি মার্জিত নয় তবে কখনও কখনও সহজ যখন আপনাকে অ্যাসিঙ্ক অপারেশন পরিচালনা করতে হয় এবং আপনি যখন ডায়ালগটি দেখাতে চান তখন আপনি নিশ্চিত হন না যে ওয়েটার ক্রিয়াকলাপটি শেষ হয়েছে কি না।


এত কুৎসিত এখনও এত সুন্দর!
রাহুল তিওয়ারি

8
  • আমার ক্ষেত্রে সমস্যাটি ঘটেছিল কারণ onPostExecuteঅ্যাসিঙ্কটাস্কে ডায়ালগ বাক্সটি খুলতে / দেখানোর চেষ্টা করছি

  • তবে এটির একটি ভুল পদ্ধতি showing dialogবা ইউআই পরিবর্তিত হয় onPostExecute

  • তার জন্য, আমাদের ক্রিয়াকলাপটি সক্রিয় উদ্বৃত্তে রয়েছে কিনা তা পরীক্ষা করতে হবে :, !isFinishing() যদি কার্যকলাপটি শেষ না হয় তবে কেবলমাত্র আমাদের ডায়ালগ বাক্স বা ইউআই পরিবর্তন দেখাতে সক্ষম show

    @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

অন্য বিকাশকারী ব্যবহারের কেস: যদি 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);
        }
    }

আমার অবশ্যই "ডাবল-ক্লাস" ব্যবহার করতে হবে কারণ একটি ইন্টারফেস স্থির থাকতে পারে না। L-


0

উইন্ডো যুক্ত করতে অক্ষম - টোকেনটি বৈধ নয়; আপনার কার্যক্রম চলছে?

এই ক্রাশটি সাধারণত আপনার অ্যাপ্লিকেশনটি পূর্ব-সমাপ্ত ক্রিয়াকলাপটিকে প্রসঙ্গে হিসাবে একটি ডায়ালগ প্রদর্শন করার চেষ্টা করার কারণে ঘটে থাকে। উদাহরণস্বরূপ, যদি কোনও ক্রিয়াকলাপ এমন একটি এসিঙ্কটাস্ক ট্রিগার করে যা ডায়ালগটি শেষ হওয়ার পরে প্রদর্শনের চেষ্টা করে তবে ব্যবহারকারী কাজটি শেষ হওয়ার আগেই কার্যকলাপ থেকে ফিরে নেভিগেট করে।

বাহ্যিক সংস্থান

অ্যান্ড্রয়েড - পটভূমি থ্রেডগুলি থেকে ডায়ালগগুলি প্রদর্শন করা হচ্ছে

ত্রুটি: বাইন্ডারপ্রক্সি @ 45d459c0 বৈধ নয়; আপনার কার্যক্রম চলছে?


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.