我的主要目标是删除Firebase Auth和Firebase数据库上的帐户。我正在使用一个接口来同步数据的接收,一个要删除的按钮和一个用于返回我的用户的函数。
初始变量:
FirebaseAuth mAuth = FirebaseAuth.getInstance();
final FirebaseUser mUser = mAuth.getCurrentUser();
DatabaseReference mUserRef = FirebaseDatabase.getInstance().getReference("Users");
界面:
public interface IMyInterface {
void returnUser(User user);
}
删除用户的按钮:
btnDeleteAccount.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
readUser(new IMyInterface() {
@Override
public void returnUser(User user) {
String email = user.getEmail();
String password = user.getPassword();
Log.d("EMAIL+PASSWORD", email+password);
AuthCredential credential = EmailAuthProvider
.getCredential(user.getEmail(), user.getPassword());
mUser.reauthenticate(credential).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()) {
mUser.delete().addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
mUserRef.child(mUser.getUid()).removeValue();
mAuth.signOut();
finish();
startActivity(new Intent(MainActivity.this, LoginActivity.class));
Toast.makeText(MainActivity.this, "User account deleted!", Toast.LENGTH_SHORT).show();
}
}
});
}
}
});
}
});
}
});
以及用于检索包含用户信息的User
的功能:
private void readUser(final IMyInterface myCallback) {
mUserRef.child(mUser.getUid()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
user = dataSnapshot.getValue(User.class);
myCallback.returnUser(user);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
因此,在调用按钮之后,它将调用该函数以接收用户信息(电子邮件和密码),然后使用这两种信息来删除和注销。问题在于,当按钮内的最后一个命令结束时,它将在String email = user.getEmail()
处重新启动按钮,但是由于没有实例化用户,因此getEmail()
方法将返回null
,并且应用崩溃。
为什么再次返回该方法?还是我缺少同步方面的东西?我确实有另一个按钮,该按钮在使用“用户信息”并且需要更改活动时结束。
答案 0 :(得分:1)
之所以有此行为,是因为您使用的是bx
而不是addValueEventListener
方法。大多数情况下,两者都做相同的事情,但有区别,addListenerForSingleValueEvent
在获取数据后立即断开连接,而addListenerForSingleValueEvent
则继续监听。
要解决这个问题,请使用addValueEventListener
方法或remove the listener according to the life-cycle of your activity。