尊敬的开发人员,我试图从Facebook保存数据,我正在获取其他所有数据,但无法获取电子邮件和性别。

这是我的代码

loginButton.setReadPermissions("public_profile");
    loginButton.setReadPermissions("email");
    loginButton.setReadPermissions("user_friends");


    loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            AccessToken accessToken = loginResult.getAccessToken();
            GraphRequest request = GraphRequest.newMeRequest( loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                @Override
                public void onCompleted(JSONObject object,GraphResponse response) {
                    if (response != null) {
                        try {
                            email = object.getString("email");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        try {
                            gender = object.getString("gender");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
            Bundle parameters = new Bundle();
            parameters.putString("fields", "email,gender");
            request.setParameters(parameters);
            request.executeAsync();


            Profile profile = Profile.getCurrentProfile();

            userid = profile.getId();
            userfirstname = profile.getFirstName();
            middlename = profile.getMiddleName();
            userlastname = profile.getLastName();
            userimage = profile.getProfilePictureUri(30, 40);
            linkuri = profile.getLinkUri();
            name = profile.getName();




            new AsyncTask<String, String, String>() {
                @Override
                protected String doInBackground(String... params) {
                    WebService ws = new WebService(URL);
                    Map<String, String> data = new HashMap<String, String>();
                    data.put("user_fb_id", userid);
                    data.put("first_name", userfirstname);
                    data.put("middle_name", userfirstname);
                    data.put("gender", gender);
                    data.put("email", email);
                    data.put("last_name", userfirstname);
                    data.put("user_fb_profile_name", name);
                    data.put("fb_profile_pic", userimage.toString());


                    try {
                        String response = ws.makeHTTPRequest(data, "POST");
                        JSONObject jsonObject = new JSONObject(response);
                        Log.e("Response", jsonObject.toString());

                    } catch (Exception e) {
                        Log.d("", "Exception : " + e.getMessage());
                    }
                    return null;
                }
            }.execute();

        }

        @Override
        public void onCancel() {
            //info = ("Login attempt canceled.");
        }

        @Override
        public void onError(FacebookException e) {
            // info = ("Login attempt failed.");
        }
    });


现在,我将告诉您上述代码中的错误是什么。

当我运行GraphRequest时,它将成功执行,但没有收到电子邮件和性别。电子邮件和性别等于null在GrapRequest方法之后,我正在运行AsyncTask并在我的Web服务帖子类中发送该数据,我的班级给我错误的电子邮件和性别错误,但是当我在执行AsyncTask之后将电子邮件和性别悬停时,该数据请帮助我如何解决该问题。

我想要什么,如果有另一种方法,我想存储用户基本数据,这也让我知道我会尝试的。

最佳答案

发生问题的原因是在您的代码中,两个Asynctask同时运行。
意味着GraphRequest类还运行asynctask以获取用户数据,并且您还运行async以将用户数据发送到服务器。

异步任务始终在单独的线程上运行(不在主线程上),并且它们不等待其他任务完成。

因此,解决方案是在onCompleted()方法中调用Async任务。喜欢..

编写此异步类,以便将数据上传到registerCallback之外的服务器。

private class Upload_Data extends AsyncTask<String, String, String>() {
 @Override
            protected String doInBackground(String... params) {
                WebService ws = new WebService(URL);
                Map<String, String> data = new HashMap<String, String>();
                data.put("user_fb_id", userid);
                data.put("first_name", userfirstname);
                data.put("middle_name", userfirstname);
                data.put("gender", gender);
                data.put("email", email);
                data.put("last_name", userfirstname);
                data.put("user_fb_profile_name", name);
                data.put("fb_profile_pic", userimage.toString());


                try {
                    String response = ws.makeHTTPRequest(data, "POST");
                    JSONObject jsonObject = new JSONObject(response);
                    Log.e("Response", jsonObject.toString());

                } catch (Exception e) {
                    Log.d("", "Exception : " + e.getMessage());
                }
                return null;
            }
        }


然后在获取电子邮件和性别值之后,在onCompleted方法中调用此异步类,并在调用Asynctask类之前检查电子邮件和性别是否不为null。

@Override
            public void onCompleted(JSONObject object,GraphResponse response) {
                if (response != null) {
                    try {
                        email = object.getString("email");
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    try {
                        gender = object.getString("gender");
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
  if(email!=null && gender!=null){
new Upload_Data().execute();
}
            }
        });


希望这会有所帮助。

08-04 22:44