Не удалось добавить окно-токен 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)
есть идеи?
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