2012-03-02 12 views
69

intento conectar a Facebook A TRAVÉS DE API de Facebook, sigo a este ejemplo: https://github.com/facebook/facebook-android-sdk/tree/master/examples/simpleNo se puede agregar la ventana - token android.os.BinderProxy no es válido; esta corriendo tu actividad?

todo está bien, pero cuando intento editar un código, que significa que quiera visualizar el mensaje de envío de diálogo después de la entrada es exitosa de esta manera:

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

recibo este error en el logcat:

03-02 13:32:08.629: E/AndroidRuntime(14991): android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] 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) 

Alguna idea?

+0

posible duplicado de [Error: BinderProxy @ 45d459c0 no es válido; se está ejecutando su actividad?] (http://stackoverflow.com/questions/7811993/error-binderproxy45d459c0-is-not-valid-is-your-activity-running) – bsara

+1

Compruebe la respuesta a continuación. He marcado que es correcto :) –

+0

El hecho de que haya marcado la respuesta no cambia el hecho de que esta es una pregunta duplicada. Al otro se le preguntó primero y es un problema idéntico con una respuesta esencialmente idéntica. – bsara

Respuesta

90

Esto puede ocurrir cuando se muestra el cuadro de diálogo para un contexto que ya no existe. Un caso común: si la operación 'mostrar diálogo' se produce después de una operación asíncrona, y durante esa operación, se destruye la actividad original (que será el elemento principal de su diálogo). Para una buena descripción, consulte esta entrada del blog y los comentarios:

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

Desde el seguimiento de la pila anterior, parece que la biblioteca facebook escinde la operación de autenticación de forma asíncrona, y usted tiene una Handler - mecanismo de devolución de llamada (onComplete llamado a un oyente) que podría crear fácilmente este escenario.

Cuando he visto esto informado en mi aplicación, es bastante raro y coincide con la experiencia en la publicación del blog. Algo salió mal para la actividad/fue destruida durante el trabajo de AsyncTask. No sé cómo su modificación podría resultar en esto cada vez, pero tal vez está haciendo referencia a una actividad como el contexto para el diálogo que siempre se destruye en el momento en que se ejecuta el código.

Asimismo, si bien no estoy seguro si esta es la mejor manera de saber si su actividad se está ejecutando, consulte esta respuesta para un método de hacerlo:

Check whether activity is active

+0

¡No resolvió mi problema, pero me guió bien! –

+2

Al no llamar 'dialog.show()' resuelve el problema, pero ¿cuál es el trabajo que se hace para poder mostrar aún mi diálogo? – natsumiyu

99

que estaba viendo este error informó de vez en cuando de algunos de mis aplicaciones, y esto es lo que lo resolvió para mí:

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

Todas las otras respuestas por ahí parecen estar haciendo cosas raras como iteración a través de la lista de actividades en ejecución, pero esto es mucho más simple y parece hacer la t almiar.

+3

no resuelve el problema, también evita el bloqueo y muestra el diálogo – YTerle

+2

¡Recuerde que debe marcar 'context instanceof Activity' o puede obtener una' Exception'! – FtheBuilder

+2

o puede usar getActivity(). IsFinishing() en vez del contexto –

3

This website enumera 3 métodos distintos para verificar si un determinado Activity es ejecutando y proporciona fragmentos de código para ayudarlo. Sin embargo, tenga en cuenta que comprobar si una actividad aún se está ejecutando es solo recomendado para la depuración de, ya que su resultado es algo menos cierto y, por lo tanto, no es adecuado para el flujo de código/lógica.

+0

¿podría explicar qué hay detrás del enlace? – Antek

2

Me enfrenté exactamente al mismo problema. Llamar al '(!isFinishing())' evitó el bloqueo, pero no pudo mostrar el mensaje de "alerta".

Luego intenté llamar a la función 'estática', donde se muestra la alerta. Después de eso, no se produjo un bloqueo y el mensaje también se muestra.

Por ejemplo:

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

Se puede utilizar una variable estáticadentro de la actividad. Si isActivityLive es true, llame a su método.

class MyActivity extends Activity { 
    static boolean isActivityLive = false; 

     @Override 
     public void onStart() { 
     super.onStart(); 
     isActivityLive = true; 
     } 

     @Override 
     public void onStop() { 
     super.onStop(); 
     isActivityLive = false; 
     } 
} 
Cuestiones relacionadas