在使用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()是否已经填充,因为从这样做的方法回调调用了这个方法?
重启应用后,它可以正常工作。但如果按下注销,则会继续相同。
答案 0 :(得分:0)
调用logoutInBackground后,将来对getCurrentUser()的调用将返回null。
您需要再次初始化用户。
signUpInBackground将在服务器上创建一个新的ParseUser,并将会话保留在磁盘上,以便您可以使用ParseUser.getCurrentUser()访问该用户。 但是我不确定你每次登录都应该打电话。
您可以将用户从done回调参数传递给saveTokenMethod,而不是在saveToken方法中调用getCurrentuser。
在用于注册和登录的不同方法中分离逻辑。我建议您在致电signUp前进行检查,并且每次要登录时都不要滥用