登录成功后,Parse getCurrentUser()返回null

时间:2015-05-07 15:19:47

标签: java android parse-platform

在使用Parse的Android应用程序中,登录流程就像这样......

我们有自己的逻辑来查看用户是否输入了正确的凭据。一旦我们验证了,就会调用signUpOrLoginOnParse()。 Parse仅用于存储数据和本地处理会话。没有令牌,用户无法访问api。

private void signUpOrLogin(final String username, final String token) {
    ParseUser user = new ParseUser();
    user.setUsername(username);
    user.setPassword(username);
    user.signUpInBackground(new SignUpCallback() {
        @Override
        public void done(ParseException e) {
            if (e == null) {
                // sign up success. ParseUser.getCurrentUser() populated
                saveTokenToCloud(token);
            } else if ("condition to check if the user already exists") {
                // existing user, login.
                ParseUser.logInInBackground(username, username, new LogInCallback() {
                    @Override
                    public void done(ParseUser parseUser, ParseException e) {
                        // login was successful, ParseUser.getCurrentUser() populated
                        saveTokenToCloud(token);
                    }
                });
            } else {
                showProgress(false);
                e.printStackTrace();
            }
        }
    });
}

private void saveTokenToCloud(String token) {
    // saving token to cloud
    ParseUser user = ParseUser.getCurrentUser();
    user.put("token", token); // THIS IS WHERE I GET NULL POINTER EXCEPTION
    user.saveEventually();

    // link installation to user.
    ParseInstallation parseInstallation = ParseInstallation.getCurrentInstallation();
    parseInstallation.put("user", user);
    parseInstallation.saveEventually();

    // Starting next activity
    Intent i = new Intent(this, NextActivity.class);
    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);
    finish();
}

首次运行应用时,一切都很好。一旦按下注销按钮(包含 - Parse.logoutInBackground()),它就会显示LoginActivity(当前的一个)。在尝试登录时,一切都成功但我在saveTokenToCloud()的第3行遇到了NullPointerException。

它说 - 尝试在空对象引用上调用虚方法.put()。

但是,Parse.currentUser()是否已经填充,因为从这样做的方法回调调用了这个方法?

重启应用后,它可以正常工作。但如果按下注销,则会继续相同。

1 个答案:

答案 0 :(得分:0)

调用logoutInBackground后,将来对getCurrentUser()的调用将返回null。

您需要再次初始化用户。

signUpInBackground将在服务器上创建一个新的ParseUser,并将会话保留在磁盘上,以便您可以使用ParseUser.getCurrentUser()访问该用户。 但是我不确定你每次登录都应该打电话。

您可以将用户从done回调参数传递给saveTokenMethod,而不是在saveToken方法中调用getCurrentuser。

在用于注册和登录的不同方法中分离逻辑。我建议您在致电signUp前进行检查,并且每次要登录时都不要滥用