2012-05-25 5 views
7

Actualmente estoy creando una aplicación usando Phonegap 1.6.0 y Sencha Touch 1.1. Recientemente, cuando probamos en un teléfono inteligente con Android 4.0.4, descubrimos que el inicio de sesión de Facebook no funciona del todo como se esperaba. Estamos utilizando el complemento Facebook de Phonegap ubicado en here con parches para Cordova. Lo que sucede es que, una vez que intentamos iniciar sesión en Facebook en un teléfono inteligente con Android Honeycomb o superior, la aplicación lanza una excepción NetworkOnMainThreadException porque las operaciones de red no están permitidas en el hilo principal. Esta excepción solo se aplica en Android Honeycomb o superior, por lo que no lo notamos en 2.3.3. La excepción se produce cuando se llama a FB.login() y no se alcanza la devolución de llamada.NetworkOnMainThreadException en Facebook Inicie sesión con Phonegap 1.6.0

He revisado varios hilos y temas, pero todos son extremadamente imprecisos. Soy consciente de que tengo que ejecutar la operación de red en un hilo separado, pero No estoy seguro de cómo se debe hacer esto. El enhebrado parece ocurrir en Java, pero no estoy usando ningún Java, así que antes de buscar un código que no haya sido escrito por mí, me gustaría algo de ayuda.

Intentaré reducir qué parte causa la excepción más adelante. Cualquier ayuda sería apreciada.

pila de errores:

05-25 15:42:29.018: I/Web Console(3785): Cordova Facebook Connect plugin initialized successfully. at file:///android_asset/www/cdv-plugin-fb-connect.js:24 
05-25 15:42:29.120: D/OpenGLRenderer(3785): Flushing caches (mode 0) 
05-25 15:42:30.479: D/ConnectPlugin(3785): authorized 
05-25 15:42:30.479: D/ConnectPlugin(3785): Bundle[{expires_in=5177550, access_token=censored, code=censored}] 
05-25 15:42:30.503: D/AndroidRuntime(3785): Shutting down VM 
05-25 15:42:30.503: W/dalvikvm(3785): threadid=1: thread exiting with uncaught exception (group=0x40a671f8) 
05-25 15:42:30.511: E/AndroidRuntime(3785): FATAL EXCEPTION: main 
05-25 15:42:30.511: E/AndroidRuntime(3785): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=32665, result=-1, data=Intent { (has extras) }} to activity {com.company.product/com.company.product.productActivity}: android.os.NetworkOnMainThreadException 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at android.app.ActivityThread.deliverResults(ActivityThread.java:2980) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3023) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at android.app.ActivityThread.access$1100(ActivityThread.java:123) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1177) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at android.os.Looper.loop(Looper.java:137) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at java.lang.reflect.Method.invoke(Method.java:511) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at dalvik.system.NativeStart.main(Native Method) 
05-25 15:42:30.511: E/AndroidRuntime(3785): Caused by: android.os.NetworkOnMainThreadException 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:664) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at libcore.io.Streams.readSingleByte(Streams.java:41) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:655) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at libcore.net.http.HttpConnection.isStale(HttpConnection.java:256) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:71) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:460) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:432) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:270) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at com.facebook.android.Util.openUrl(Util.java:206) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at com.facebook.android.Facebook.request(Facebook.java:751) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at com.facebook.android.Facebook.request(Facebook.java:688) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at org.apache.cordova.facebook.ConnectPlugin$AuthorizeListener.onComplete(ConnectPlugin.java:271) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at com.facebook.android.Facebook.authorizeCallback(Facebook.java:433) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at org.apache.cordova.facebook.ConnectPlugin.onActivityResult(ConnectPlugin.java:196) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at org.apache.cordova.DroidGap.onActivityResult(DroidGap.java:1178) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at android.app.Activity.dispatchActivityResult(Activity.java:4649) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  at android.app.ActivityThread.deliverResults(ActivityThread.java:2976) 
05-25 15:42:30.511: E/AndroidRuntime(3785):  ... 11 more 

Respuesta

20

que logró resolver el error poniendo la parte de autenticación de ConnectPlugin.java en un hilo separado. Para futuros lectores, publicaré las instrucciones a continuación.

En ConnectPlugin.java, reemplace:

try { 
    JSONObject o = new JSONObject(this.fba.facebook.request("/me")); 
    this.fba.userId = o.getString("id"); 
    this.fba.success(getResponse(), this.fba.callbackId); 
} catch (MalformedURLException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (JSONException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

con el siguiente código:

Thread t = new Thread(new Runnable() { 
    public void run() { 
     try { 
      JSONObject o = new JSONObject(fba.facebook.request("/me")); 
      fba.userId = o.getString("id"); 
      fba.success(getResponse(), fba.callbackId); 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
}); 
t.start(); 

Esto debería solucionar el NetworkOnMainThreadException.

+0

Gracias! Esto todavía está roto en el complemento oficial. ¿Has enviado una solicitud de extracción? – vish

+0

Aún no. Me considero muy inexperto como para ayudar con estos asuntos, pero lo echaré un vistazo esta tarde. Aunque leí algo sobre esto en la sección de errores. – Rex

+0

¡Hola del futuro! - FYI: El problema es [aquí en Github] (https://github.com/davejohnson/phonegap-plugin-facebook-connect/issues/122) –

Cuestiones relacionadas