Я пытаюсь подключиться к Facebook через API Facebook, следую этому примеру: 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());
}
Я получаю эту ошибку в журнале регистрации:
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)
Любая идея?
Ответы:
Это может произойти, когда вы показываете диалог для контекста, который больше не существует. Распространенный случай - если операция «показать диалог» выполняется после асинхронной операции, и во время этой операции исходное действие (которое должно быть родительским для вашего диалога) уничтожается. Хорошее описание см. В этом сообщении в блоге и в комментариях:
http://dimitar.me/android-displaying-dialogs-from-background-threads/
Из трассировки стека выше видно, что библиотека facebook запускает операцию аутентификации асинхронно, и у вас есть механизм Handler - Callback (onComplete, вызываемый на слушателе), который может легко создать этот сценарий.
Когда я видел это в своем приложении, это довольно редко и соответствует опыту в сообщении в блоге. Что-то пошло не так с действием / оно было уничтожено во время работы AsyncTask. Я не знаю, как ваша модификация может приводить к этому каждый раз, но, возможно, вы ссылаетесь на Activity как на контекст для диалога, который всегда уничтожается во время выполнения вашего кода?
Кроме того, хотя я не уверен, что это лучший способ узнать, выполняется ли ваша деятельность, см. Этот ответ, чтобы узнать об одном из способов сделать это:
Проверить, активна ли активность
источник
dialog.show()
решает проблему, но что нужно сделать, чтобы по-прежнему отображать мой диалог?Fragment.getContext()
, что работает для API выше 21. Но на Lollipop он вылетаетВремя от времени я получал сообщения об этой ошибке из некоторых моих приложений, и вот что решило ее для меня:
Все остальные ответы, похоже, делают странные вещи, такие как итерация по списку выполняемых действий, но это намного проще и, похоже, помогает.
источник
context instanceof Activity
иначе вы можете получитьException
!один простой обходной путь - поймать исключение:
Это не изящно, но иногда просто, когда вам нужно управлять асинхронными операциями, и вы не уверены, активна ли активность, когда вы хотите показать диалог.
источник
В моем случае проблема возникла из-за того, что я пытаюсь открыть / показать диалоговое окно в
onPostExecute
AsyncTask.Однако это неправильный метод
showing dialog
или изменение пользовательского интерфейсаonPostExecute
.Для этого нам нужно проверить, что действие находится в активном состоянии. Например:
!isFinishing()
если действие не завершено, мы можем показать только наше диалоговое окно или изменение пользовательского интерфейса.источник
Я столкнулся с той же проблемой. Вызов
'(!isFinishing())'
предотвратил сбой, но не смог отобразить «предупреждение».Затем я попытался сделать вызывающую функцию «статической» , где отображается предупреждение. После этого сбоя не произошло, и сообщение также отображается.
Например:
источник
После выполнения потока добавьте эти две строки кода, и это решит проблему.
источник
Другое использование разработчик случай: Если
WindowManager
илиgetWindow()
вызываются наonCreate()
илиonStart()
илиonResume()
,BadTokenException
отбрасываются. Вам нужно будет подождать, пока вид будет подготовлен и прикреплен.Перемещение кода для
onAttachedToWindow()
ее решения. Возможно, это не постоянное решение, но, насколько я мог проверить, оно всегда работало.В моем случае требовалось увеличить яркость экрана, когда активность стала видна. Строка
getWindow().getAttributes().screenBrightness
вonResume()
списке привела к исключению. Перемещение кода вonAttachedToWindow()
рабочий.источник
Для меня это было исправлено путем простого удаления
static
свойства в методах DialogHelper.class (предназначенных для создания и скрытия диалога), поскольку у меня есть свойства, связанные сWindow
этими методамиисточник
В dependencyServices мне ничего из вышеперечисленного не помогло, в итоге я сделал, как показано ниже:
Я должен использовать «двойной класс», потому что интерфейс не может быть статичным. L-
источник
Невозможно добавить окно - токен недействителен; ваша деятельность идет?
Этот сбой обычно вызван тем, что ваше приложение пытается отобразить диалоговое окно, используя ранее завершенное действие в качестве контекста. Например, это может произойти, если Activity запускает AsyncTask, который пытается отобразить диалоговое окно после его завершения, но пользователь возвращается из Activity до того, как задача будет завершена.
Внешние ресурсы
Android - отображение диалогов из фоновых потоков
Ошибка: BinderProxy @ 45d459c0 недействителен; ваша деятельность идет?
источник
Я решил это, поставив это:
источник