Android LoginActivity、Facebook CallbackManager和Graph API请求:executeAndWait()方法不起作用

Android LoginActivity、Facebook CallbackManager和Graph API请求:executeAndWait()方法不起作用,android,facebook,facebook-graph-api,login,callback,Android,Facebook,Facebook Graph Api,Login,Callback,我是android新手,我正在构建一个需要登录的应用程序。到目前为止,google+和基本的电子邮件登录都很有效,但我在Facebook登录时遇到了麻烦。我的大部分代码都来自Facebook开发者文档,我曾尝试用不同的方式解决这个问题,但没有成功 这是我的onCreate方法,我在其中设置callbackManager和loginButton。loginButton注册回调。如果成功,它将启动一个图形请求。但是,executeAndWait()方法永远不起作用 @Override publi

我是android新手,我正在构建一个需要登录的应用程序。到目前为止,google+和基本的电子邮件登录都很有效,但我在Facebook登录时遇到了麻烦。我的大部分代码都来自Facebook开发者文档,我曾尝试用不同的方式解决这个问题,但没有成功

这是我的onCreate方法,我在其中设置callbackManager和loginButton。loginButton注册回调。如果成功,它将启动一个图形请求。但是,
executeAndWait()
方法永远不起作用

 @Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    FacebookSdk.sdkInitialize(getApplicationContext());
    setContentView(R.layout.activity_login);

    mFacebookCallbackManager = CallbackManager.Factory.create();

    // Set up facebook login button
    LoginButton facebookLoginButton = (LoginButton) findViewById(R.id.facebook_sign_in_button);
    facebookLoginButton.setReadPermissions("public_profile", "email");

    facebookLoginButton.registerCallback(mFacebookCallbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            Log.e("callback", "success");
            new GraphRequest(AccessToken.getCurrentAccessToken(), "/me", null, HttpMethod.GET, new GraphRequest.Callback() {
                public void onCompleted(GraphResponse response) {
                    /* handle the result */
                    try {
                        getFacebookUserData(response.getJSONObject());
                    } catch (JSONException e) {
                        Log.e("graph request", "json exception");
                        e.printStackTrace();
                    }
                }
            }
            ).executeAndWait(); //<<<<----- problem is here!!! :(
            Log.e("graph request", "executed");
            uploadUserToServer();
            startLaunchActivity();
        }

        @Override
        public void onCancel() { }

        @Override
        public void onError(FacebookException exception) {
            Log.e("callback", "error");
            exception.printStackTrace();}

    });

}
在我的代码中还有其他一些方法我还没有展示,但是它们做了其他不相关的事情。这段代码还不包括google+登录,这给它的
onConnectedMethod()
增加了一层难度。我只想执行GraphRequest

这是日志

07-22 11:01:54.784  14078-14078/com.deepomatic.dream E/callback﹕ success
07-22 11:01:54.847  14078-14078/com.deepomatic.dream D/dalvikvm﹕ GC_FOR_ALLOC freed 378K, 4% free 9993K/10408K, paused 46ms, total 48ms
07-22 11:01:54.870  14078-14078/com.deepomatic.dream D/AndroidRuntime﹕ Shutting down VM
07-22 11:01:54.870  14078-14078/com.deepomatic.dream W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x416b7700)
07-22 11:01:54.901  14078-14078/com.deepomatic.dream E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=64206, result=-1, data=Intent { (has extras) }} to activity {com.deepomatic.dream/com.deepomatic.dream.LoginActivity2}: android.os.NetworkOnMainThreadException
        at android.app.ActivityThread.deliverResults(ActivityThread.java:3367)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:3410)
        at android.app.ActivityThread.access$1100(ActivityThread.java:141)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1304)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5103)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133)
        at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:708)
        at java.io.OutputStream.write(OutputStream.java:82)
        at libcore.net.http.HttpEngine.writeRequestHeaders(HttpEngine.java:665)
        at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:814)
        at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:283)
        at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497)
        at libcore.net.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:134)
        at com.facebook.GraphResponse.fromHttpConnection(GraphResponse.java:253)
        at com.facebook.GraphRequest.executeConnectionAndWait(GraphRequest.java:1130)
        at com.facebook.GraphRequest.executeBatchAndWait(GraphRequest.java:1032)
        at com.facebook.GraphRequest.executeBatchAndWait(GraphRequest.java:999)
        at com.facebook.GraphRequest.executeBatchAndWait(GraphRequest.java:983)
        at com.facebook.GraphRequest.executeAndWait(GraphRequest.java:958)
        at com.facebook.GraphRequest.executeAndWait(GraphRequest.java:854)
        at com.deepomatic.dream.LoginActivity2$1.onSuccess(LoginActivity2.java:91)
        at com.deepomatic.dream.LoginActivity2$1.onSuccess(LoginActivity2.java:76)
        at com.facebook.login.LoginManager.finishLogin(LoginManager.java:508)
        at com.facebook.login.LoginManager.onActivityResult(LoginManager.java:192)
        at com.facebook.login.LoginManager$1.onActivityResult(LoginManager.java:140)
        at com.facebook.internal.CallbackManagerImpl.onActivityResult(CallbackManagerImpl.java:82)
        at com.deepomatic.dream.LoginActivity2.onActivityResult(LoginActivity2.java:114)
        at android.app.Activity.dispatchActivityResult(Activity.java:5322)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:3363)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3410)
at  android.app.ActivityThread.access$1100(ActivityThread.java:141)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1304)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)            

使用此代码登录facebook。这对我很有用

callbackManager=callbackManager.Factory.create();
loginButton=(loginButton)findviewbyd(R.id.login_按钮);
ListpermissionNeeds=Arrays.asList(“用户照片”、“电子邮件”,
“用户生日”、“公共个人资料”、“AccessToken”);
loginButton.registerCallback(callbackManager,
新建FacebookCallback(){@Override
成功时公共无效(LoginResult LoginResult){
System.out.println(“onSuccess”);
字符串accessToken=loginResult.getAccessToken()
.getToken();
Log.i(“accessToken”,accessToken);
GraphRequest请求=GraphRequest.newmereRequest(
loginResult.getAccessToken(),
新建GraphRequest.GraphJSONObjectCallback(){@Override
未完成的公共void(JSONObject对象,
GraphResponse(反应){
Log.i(“LoginActivity”,
response.toString());
试一试{
stringid=object.getString(“id”);
试一试{
URL配置文件\u pic=新URL(
"http://graph.facebook.com/“+id+”/picture?type=large”);
Log.i(“个人资料图片”,
个人资料(图片+);
}捕获(格式错误){
e、 printStackTrace();
}
字符串名称=object.getString(“名称”);
String email=object.getString(“email”);
字符串性别=object.getString(“性别”);
字符串生日=object.getString(“生日”);
}捕获(JSONException e){
e、 printStackTrace();
}
}
});
Bundle参数=新Bundle();
parameters.putString(“字段”,
“身份证、姓名、电子邮件、性别、生日”);
请求。设置参数(参数);
request.executeAsync();
}
@凌驾
公开作废{
System.out.println(“onCancel”);
}
@凌驾
public void onError(facebook异常){
System.out.println(“onError”);
Log.v(“LoginActivity”,exception.getCause().toString());
}

});
这就像一个Asynctask任务,这意味着它需要时间,我需要知道这是完成的,并且应该得到值我将如何做?我有同样的问题,下面的答案对我有效,但现在我有一个问题,我应该知道任务何时完成,并且应该得到值,请帮助我
07-22 11:01:54.784  14078-14078/com.deepomatic.dream E/callback﹕ success
07-22 11:01:54.847  14078-14078/com.deepomatic.dream D/dalvikvm﹕ GC_FOR_ALLOC freed 378K, 4% free 9993K/10408K, paused 46ms, total 48ms
07-22 11:01:54.870  14078-14078/com.deepomatic.dream D/AndroidRuntime﹕ Shutting down VM
07-22 11:01:54.870  14078-14078/com.deepomatic.dream W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x416b7700)
07-22 11:01:54.901  14078-14078/com.deepomatic.dream E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=64206, result=-1, data=Intent { (has extras) }} to activity {com.deepomatic.dream/com.deepomatic.dream.LoginActivity2}: android.os.NetworkOnMainThreadException
        at android.app.ActivityThread.deliverResults(ActivityThread.java:3367)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:3410)
        at android.app.ActivityThread.access$1100(ActivityThread.java:141)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1304)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5103)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133)
        at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:708)
        at java.io.OutputStream.write(OutputStream.java:82)
        at libcore.net.http.HttpEngine.writeRequestHeaders(HttpEngine.java:665)
        at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:814)
        at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:283)
        at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497)
        at libcore.net.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:134)
        at com.facebook.GraphResponse.fromHttpConnection(GraphResponse.java:253)
        at com.facebook.GraphRequest.executeConnectionAndWait(GraphRequest.java:1130)
        at com.facebook.GraphRequest.executeBatchAndWait(GraphRequest.java:1032)
        at com.facebook.GraphRequest.executeBatchAndWait(GraphRequest.java:999)
        at com.facebook.GraphRequest.executeBatchAndWait(GraphRequest.java:983)
        at com.facebook.GraphRequest.executeAndWait(GraphRequest.java:958)
        at com.facebook.GraphRequest.executeAndWait(GraphRequest.java:854)
        at com.deepomatic.dream.LoginActivity2$1.onSuccess(LoginActivity2.java:91)
        at com.deepomatic.dream.LoginActivity2$1.onSuccess(LoginActivity2.java:76)
        at com.facebook.login.LoginManager.finishLogin(LoginManager.java:508)
        at com.facebook.login.LoginManager.onActivityResult(LoginManager.java:192)
        at com.facebook.login.LoginManager$1.onActivityResult(LoginManager.java:140)
        at com.facebook.internal.CallbackManagerImpl.onActivityResult(CallbackManagerImpl.java:82)
        at com.deepomatic.dream.LoginActivity2.onActivityResult(LoginActivity2.java:114)
        at android.app.Activity.dispatchActivityResult(Activity.java:5322)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:3363)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3410)
at  android.app.ActivityThread.access$1100(ActivityThread.java:141)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1304)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)