2012-05-25 4 views
7

현재 Phonegap 1.6.0과 Sencha Touch 1.1을 사용하여 응용 프로그램을 만들고 있습니다. 최근 Android 4.0.4로 스마트 폰을 테스트 할 때 Facebook 로그인이 예상대로 작동하지 않는다는 사실을 발견했습니다. 우리는 Phonegap Facebook 플러그 인 here에 Cordova 용 패치를 사용하고 있습니다. Android Honeycom 이상의 스마트 폰에서 Facebook에 로그인하면 응용 프로그램은 Network 운영이 메인 스레드에서 허용되지 않기 때문에 NetworkOnMainThreadException을 실행합니다. 이 예외는 Android Honeycomb 이상에서만 발생합니다. 따라서 2.3.3에서는이를 알 수 없었습니다. FB.login()을 호출 할 때 예외가 발생하고 콜백에 도달하지 않습니다.NetworkOnMainThreadException with Phonegap 1.6.0

다양한 스레드와 주제를 확인했지만 모두 매우 모호합니다. 나는 별도의 스레드에서 네트워크 작업을 실행해야한다는 것을 알고 있지만 이 작업을 수행하는 방법이 확실하지 않습니다.. 스레딩은 자바에서 일어나는 것처럼 보이지만, 자바를 전혀 사용하지 않기 때문에, 저에게 쓰여지지 않은 코드에서 원숭이가되기 전에 저는 도움을 원합니다.

나중에 어떤 부분에서 예외가 발생하는지 파악하려고합니다. 어떤 도움을 주시면 감사하겠습니다.

오류 스택 :

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 

답변

20

나는 별도의 스레드에서 ConnectPlugin.java의 인증 부분을 바꾸어 오류를 해결하기 위해 관리. 미래의 독자들을 위해, 나는 아래에 지침을 게시 할 것이다.

ConnectPlugin.java에서 교체 :

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

를 다음 코드로 :

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

NetworkOnMainThreadException을 수정해야한다고.

+0

고마워요! 이것은 공식 플러그인에서 여전히 깨졌습니다. 끌어 오기 요청을 제출 했습니까? – vish

+0

아직 없습니다. 나는이 문제에 도움이 될 수있는 자신도 경험이 없다고 생각하지만, 오늘 오후에 살펴볼 것입니다. 그래도 버그 섹션에서 그것에 대해 뭔가를 읽었습니다. – Rex

+0

안녕하세요. - FYI :이 문제는 Github에 있습니다 (https://github.com/davejohnson/phonegap-plugin-facebook-connect/issues/122) –