我是Android和firebase的新手,当我尝试从Firebase注销时遇到了一些问题。
我的一段代码在底部跟随..
在onAuthStateChanged侦听器中,我尝试创建一个Firebase用户并获取当前用户以检查它是否为null(根据Firebase文档表示用户已登录)或null表示用户不是登录..
然后出现问题..
出于测试/好奇目的,如果用户已登录,我会尝试更新用户个人资料并设置自定义显示名称..以查看会发生什么。
在更新配置文件后,更具体地说,更新了该行 " user.updateProfile(profileUpdates);"打破了signout()函数。
如果我注释掉" user.updateProfile(profileUpdates);" signout()函数似乎工作正常!
你能指出我做错了什么吗?
firebase用户是否有重复的实例?
提前致谢!
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private FirebaseAuth FireAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private FirebaseDatabase mFireDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FireAuth = FirebaseAuth.getInstance();
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
// already signed in
UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
.setDisplayName("SuperMan").build();
user.updateProfile(profileUpdates); // This breaks it!
signoutButton.setText(user.getDisplayName().toString());
} else {
// not signed in
}
}
};
}
public void signin(String email, String password){
FireAuth.signInWithEmailAndPassword(email,password).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d("myTEST","signInWithEmailAndPassword:complete:"+task.isSuccessful());
}
});
}
private void signout(){
//FireAuth.getInstance().signOut();
FireAuth.signOut();
}
public void getDisplayName(){
if (FireAuth.getCurrentUser() !=null){
UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
.setDisplayName("SuperMan").build();
FireAuth.getCurrentUser().updateProfile(profileUpdates);
signoutButton.setText(FireAuth.getCurrentUser().getUid().toString());
if(FireAuth.getCurrentUser().isAnonymous()){
signoutButton.setText("Anonymous");
}
}else{
signoutButton.setText("empty..");
}
}
@Override
public void onStart() {
super.onStart();
FireAuth.addAuthStateListener(mAuthListener);
}
@Override
public void onStop(){
super.onStop();
FireAuth.removeAuthStateListener(mAuthListener);
}
@Override
public void onClick(View v){
switch (v.getId()){
case R.id.signinButton:
signin(loginEditText.getText().toString(),passwordEditText.getText().toString());
break;
case R.id.signoutButton:
signout();
break;
case R.id.button3:
getDisplayName();
break;
}
}}
答案 0 :(得分:0)
可能会解释您所看到的行为的一些观察结果。
首先,FirebaseUser.updateProfile()可能需要往返Firebase服务器并异步完成。您可以添加带有Log
消息的完成侦听器,以便了解此信息:
UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
.setDisplayName("SuperMan").build();
user.updateProfile(profileUpdates)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Log.d(TAG, "onComplete: " + user.getDisplayName());
}
});
Log.d(TAG, "Profile change requested");
其次,更改用户个人资料似乎会导致AuthStateListener触发,这会导致代码循环播放。添加一些Log
语句将确认这种情况正在发生。我怀疑循环正在干扰注销处理。