NetworkOnMainThreadException在Facebook上使用Phonegap 1.6.0登录 [英] NetworkOnMainThreadException on Facebook Login with Phonegap 1.6.0

查看:152
本文介绍了NetworkOnMainThreadException在Facebook上使用Phonegap 1.6.0登录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在使用Phonegap 1.6.0和Sencha Touch 1.1创建应用程序。最近,当在安卓4.0.4的智能手机上测试时,我们发现Facebook登录不能正常工作。
我们正在使用Phonegap Facebook插件,位于此处,其中包含Cordova的修补程序。会发生什么,一旦我们尝试登录到与Android蜂窝或更高的智能手机上的Facebook,该应用程序启动NetworkOnMainThreadException,因为网络操作不允许在主线程。这个异常只会抛出在Android Honeycomb或以上,这就是为什么我们没有注意到它2.3.3。调用FB.login()时抛出异常,并且未达到回调。



我已检查过各种主题和主题,但都非常模糊。我知道我必须在一个单独的线程中运行网络操作,但我不确定如何这应该完成。线程似乎是在Java中发生的,但是我根本不使用任何Java,所以在我没有写的代码之前,我想要一些帮助。



我会尝试缩小什么部分导致异常后。



错误堆栈:

  25 15:42:29.018:I / Web控制台(3785):Cordova Facebook Connect插件已成功初始化。在文件:///android_asset/www/cdv-plugin-fb-connect.js:24 
05-25 15:42:29.120:D / OpenGLRenderer(3785):刷新缓存(模式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):关闭VM
05-25 15:42:30.503:W / dalvikvm(3785):threadid = 1 :线程退出未捕获异常(组= 0x40a671f8)
05-25 15:42:30.511:E / AndroidRuntime(3785):致命异常:main
05-25 15:42:30.511: AndroidRuntime(3785):java.lang.RuntimeException:传递结果ResultInfo {who = null,request = 32665,result = -1,data = Intent {(has extras)}}到活动{com.company.product / company.product.productActivity}:android.os.NetworkOnMainThreadException
05-25 15:42:30.511:E / AndroidRuntime(3785):在android.app.ActivityThread.deliverResults(ActivityThread.java:2980)
05-25 15:42:30.511:E / AndroidRuntime(3785):在android.app.ActivityThread.handleSendResult(ActivityThread.java:3023)
05-25 15:42:30.511:E / AndroidRuntime ):在android.app.ActivityThread.access $ 1100(ActivityThread.java:123)
05-25 15:42:30.511:E / AndroidRuntime(3785):在android.app.ActivityThread $ H.handleMessage .java:1177)
05-25 15:42:30.511:E / AndroidRuntime(3785):在android.os.Handler.dispatchMessage(Handler.java:99)
05-25 15:42 :30.511:E / AndroidRuntime(3785):在android.os.Looper.loop(Looper.java:137)
05-25 15:42:30.511:E / AndroidRuntime(3785):在android.app。 ActivityThread.main(ActivityThread.java:4424)
05-25 15:42:30.511:E / AndroidRuntime(3785):在java.lang.reflect.Method.invokeNative(本地方法)
05- 25 15:42:30.511:E / AndroidRuntime(3785):在java.lang.reflect.Method.invoke(Method.java:511)
05-25 15:42:30.511: :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):在dalvik.system.NativeStart.main(本地方法)
05-25 15:42:30.511:E / AndroidRuntime(3785):原因:android.os.NetworkOnMainThreadException
05-25 15:42:30.511:E / AndroidRuntime(3785):在android.os.StrictMode $ AndroidBlockGuardPolicy。 onNetwork(StrictMode.java:1099)
05-25 15:42:30.511:E / AndroidRuntime(3785):在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):在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):在libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
05- 25 15:42:30.511:E / AndroidRuntime(3785):在libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
05-25 15:42:30.511: :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):在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):在libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:270)
05- 25 15:42:30.511:E / AndroidRuntime(3785):在com.facebook.android.Util.openUrl(Util.java:206)
05-25 15:42:30.511: :at com.facebook.android.Facebook.request(Facebook.java:751)
05-25 15:42:30.511:E / AndroidRuntime(3785):at com.facebook.android.Facebook.request .java:688)
05-25 15:42:30.511:E / AndroidRuntime(3785):在org.apache.cordova.facebook.ConnectPlugin $ AuthorizeListener.onComplete(ConnectPlugin.java:271)
05-25 15:42:30.511:E / AndroidRuntime(3785):在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):在android.app.Activity.dispatchActivityResult(Activity.java:4649)
05- 25 15:42:30.511:E / AndroidRuntime(3785):在android.app.ActivityThread.deliverResults(ActivityThread.java:2976)
05-25 15:42:30.511:E / AndroidRuntime .. 11 more


解决方案

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自动生成的catch块
e.printStackTrace();
} catch(IOException e){
// TODO自动生成的catch块
e.printStackTrace();
} catch(JSONException e){
// TODO自动生成的catch块
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 .callbackId);
} catch(MalformedURLException e){
// TODO自动生成的catch块
e.printStackTrace();
} catch(IOException e){
// TODO自动生成的catch块
e.printStackTrace();
} catch(JSONException e){
// TODO自动生成的catch块
e.printStackTrace ();
}
}
});
t.start();

这应该修复 NetworkOnMainThreadException p>

I am currently creating an application using Phonegap 1.6.0 and Sencha Touch 1.1. Recently, when testing on a smartphone with Android 4.0.4, we discovered that the Facebook Login doesn't quite work as expected. We are using the Phonegap Facebook Plugin located here with patches for Cordova. What happens is that, once we try logging into Facebook on a Smartphone with Android Honeycomb or higher, the application launches a NetworkOnMainThreadException because Network operations aren't permitted on the main thread. This exception is only thrown on Android Honeycomb or above, which is why we didn't notice it on 2.3.3. The exception is thrown when calling FB.login() and the callback is not reached.

I have checked various threads and topics but all are extremely vague. I'm aware that I have to run the network operation in a seperate thread, but I am unsure how this should be done. Threading appears to happen in Java, but I'm not using any Java at all, so before monkeying around in code that wasn't written by me, I'd like some help.

I will try to narrow down what part causes the exception later. Any help would be appreciated.

Error 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

解决方案

I managed to solve the error by putting the authentication part of ConnectPlugin.java in a separate thread. For future readers, I shall post the instructions below.

In ConnectPlugin.java, replace:

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

with the following code:

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

That should fix the NetworkOnMainThreadException.

这篇关于NetworkOnMainThreadException在Facebook上使用Phonegap 1.6.0登录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆