2012-05-25 40 views
7

Tôi hiện đang tạo một ứng dụng bằng Phonegap 1.6.0 và Sencha Touch 1.1. Gần đây, khi thử nghiệm trên điện thoại thông minh với Android 4.0.4, chúng tôi phát hiện ra rằng Đăng nhập Facebook không hoạt động như mong đợi. Chúng tôi đang sử dụng Plugin Facebook Phonegap nằm ở here với các bản vá lỗi cho Cordova. Điều gì xảy ra là, khi chúng tôi thử đăng nhập vào Facebook trên điện thoại thông minh bằng Android Honeycomb hoặc cao hơn, ứng dụng sẽ khởi chạy NetworkOnMainThreadException vì các hoạt động mạng không được phép trên luồng chính. Ngoại lệ này chỉ được ném trên Android Honeycomb hoặc cao hơn, đó là lý do tại sao chúng tôi không nhận thấy điều đó trên 2.3.3. Ngoại lệ được ném khi gọi FB.login() và không thể gọi lại.NetworkOnMainThreadException trên Facebook Đăng nhập bằng Phonegap 1.6.0

Tôi đã kiểm tra nhiều chủ đề và chủ đề khác nhau nhưng tất cả đều cực kỳ mơ hồ. Tôi biết rằng tôi phải chạy hoạt động mạng trong một luồng riêng biệt, nhưng Tôi không chắc chắn cách thực hiện điều này. Threading dường như xảy ra trong Java, nhưng tôi không sử dụng bất kỳ Java nào cả, vì vậy trước khi khỉ xung quanh trong mã không được viết bởi tôi, tôi muốn một số trợ giúp.

Tôi sẽ cố gắng thu hẹp phần nào gây ra ngoại lệ sau này. Bất kỳ trợ giúp sẽ được đánh giá cao.

Lỗi stack:

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 

Trả lời

20

tôi quản lý để giải quyết các lỗi bằng cách đặt các phần xác thực của ConnectPlugin.java trong một thread riêng biệt. Đối với người đọc trong tương lai, tôi sẽ đăng các hướng dẫn dưới đây.

Trong ConnectPlugin.java, thay thế:

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

với đoạn mã sau:

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

Điều đó sẽ sửa chữa các NetworkOnMainThreadException.

+0

Cảm ơn! Điều này vẫn bị hỏng trong plugin chính thức. Bạn đã gửi yêu cầu kéo chưa? – vish

+0

Chưa. Tôi xem bản thân mình quá thiếu kinh nghiệm để giúp đỡ với những vấn đề như vậy, nhưng tôi sẽ có một cái nhìn chiều nay. Tôi đọc một cái gì đó về nó trong phần lỗi mặc dù. – Rex

+0

Xin chào từ tương lai! - FYI: Vấn đề là [ở đây trên Github] (https://github.com/davejohnson/phonegap-plugin-facebook-connect/issues/122) –

Các vấn đề liên quan