繁体   English   中英

Facebook SDK出现Android AsyncTask错误

[英]Android AsyncTask Error with Facebook SDK

我在Android App中使用Facebook SDK进行登录。 我可以用Facebook登录。 我想将AccessToken和Email插入我的数据库。 我解决了“获取电子邮件”问题,但可以通过Async从用户那里获取电子邮件。 然后,我使用AsyncTask将数据插入数据库。 当我将AsyncTask与Facebook SDK一起使用时,出现异常。

AsyncTask#5 java.lang.RuntimeException:执行doInBackground()时发生错误

和我的代码

private JSONParser jParser = new JSONParser();
private String AccessToken;
public String Email;
private LoginAPI api = new LoginAPI();
@Override
protected void onCreate(Bundle savedInstanceState) {
    FacebookSdk.sdkInitialize(getApplicationContext());
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    loginButton = (LoginButton)findViewById(R.id.login_button);

    if(Profile.getCurrentProfile()!=null){
        user = Profile.getCurrentProfile();
        new LoginAPI().execute();
    }
    loginButton.setReadPermissions("public_profile");
    loginButton.setReadPermissions("email");
    callbackManager = CallbackManager.Factory.create();

    LoginManager.getInstance().registerCallback(callbackManager,
            new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    user = Profile.getCurrentProfile();
                    AccessToken = loginResult.getAccessToken().getToken();

                    GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                        @Override
                        public void onCompleted(JSONObject user, GraphResponse graphResponse) {
                            Email = user.optString("email");
                            api.execute();
                        }
                    }).executeAsync();

                }

                @Override
                public void onCancel() {
                    AlertDialog alertMessage = new AlertDialog.Builder(Login.this).create();
                    alertMessage.setMessage("Iptal");
                    alertMessage.show();
                }

                @Override
                public void onError(FacebookException exception) {
                    AlertDialog alertMessage = new AlertDialog.Builder(Login.this).create();
                    alertMessage.setMessage(exception.toString());
                    alertMessage.show();
                }
            });
}

class LoginAPI extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    protected String doInBackground(final String... args) {

        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new NameValuePair() {
            @Override
            public String getName() {
                return "Email";
            }

            @Override
            public String getValue() {
                return Email;
            }
        });
        params.add(new NameValuePair() {
            @Override
            public String getName() {
                return "AccessToken";
            }

            @Override
            public String getValue() {
                return AccessToken;
            }
        });

        JSONObject json = jParser.makeHttpRequest("WebServiceURL", "POST", params); //Exception Line

        try {

            if (json != null) {
                Sonuc = json.getBoolean("Result");
                Mesaj = json.getString("Message");
                JSONObject _uye = json.getJSONObject("Data");
                if(_uye!=null){
                    localUser = new User(_uye.getInt("UserID"),
                            _uye.getString("FacebookID"),
                            _uye.getString("NameSurname"),
                            _uye.getString("Email"),
                            _uye.getString("ProfileImage"));
                }
                else{
                    localUser = new User(1,"","","","");
                }
            }
        } catch (JSONException e) {
            return e.getMessage().toString();
        }
        return null;
    }

    protected void onPostExecute(String file_url) {

        runOnUiThread(new Runnable() {
            public void run() {
                if(Sonuc){
                    Intent welcomeAct = new Intent(getBaseContext(), Welcome.class);
                    welcomeAct.putExtra("User",localUser);
                    Login.this.startActivity(welcomeAct);
                }
                else{
                    AlertDialog alertMessage = new AlertDialog.Builder(Login.this).create();
                    alertMessage.setMessage(Mesaj);
                    alertMessage.show();
                }
            }
        });

    }
}

我解决了这个问题。 我在OnActivityResult事件中编写了AsyncTask代码。 身份验证过程完成后,我将调用AsyncTask。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM