Не удалось добавить окно-токен android.ОС.BinderProxy недействителен; выполняется ли ваша деятельность?



Я пытаюсь подключиться к Facebook через Facebook API, я следую этому примеру: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.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)


есть идеи?

609   6  

6 ответов:

Это может произойти, когда вы показываете диалоговое окно для контекста, который больше не существует. Общий случай - если операция "показать диалог" выполняется после асинхронной операции, и во время этой операции исходное действие (то есть родитель вашего диалога) уничтожается. Для хорошего описания см. Это сообщение в блоге и комментарии:

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

из трассировки стека выше, он появляется что библиотека facebook асинхронно запускает операцию auth, и у вас есть механизм обратного вызова обработчика (onComplete вызывается на прослушивателе), который может легко создать этот сценарий.

когда я видел это сообщается в моем приложении, его довольно редко и соответствует опыту в блоге. Что-то пошло не так для активности/она была уничтожена во время работы AsyncTask. Я не знаю, как ваша модификация может привести к этому каждый раз, но, возможно, вы ссылка на действие в качестве контекста для диалога, который всегда уничтожается во время выполнения кода?

кроме того, хотя я не уверен, что это лучший способ узнать, выполняется ли ваша деятельность, см. Этот ответ для одного метода:

Проверьте, активна ли активность

Я видел эту ошибку, сообщенную время от времени из некоторых моих приложений, и вот что решило ее для меня:

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

все остальные ответы там, кажется, делают странные вещи, такие как повторение списка запущенных действий, но это намного проще и, кажется, делает трюк.

этот сайт перечисляет 3 различных метода проверки, если определенный Activity и под управлением и содержит фрагменты кода, чтобы помочь вам. Однако имейте в виду, что проверка того, выполняется ли действие, является только для отладки цели, как его результат ничего, кроме определенных и, следовательно, не подходит для кода/логики потока.

я столкнулся с точно такой же проблемой. Звоню '(!isFinishing())' предотвратил сбой, но не смог отобразить сообщение "alert".

затем я попытался сделать вызов функции 'static', где отображается предупреждение. После этого никакого сбоя не произошло, и сообщение также отображается.

например:

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

один простой обходной путь, чтобы поймать исключение :

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

это не элегантно, но иногда легко, когда вам нужно управлять асинхронными операциями, и вы не уверены, что активность поднята или нет, когда вы хотите показать диалог.

после выполнения резьбы, добавьте эти две строки кода, и это решит проблему.

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

Comments

    Ничего не найдено.