循环尝试删除Firebase数据库上的帐户

时间:2018-12-21 13:04:36

标签: java android firebase firebase-realtime-database

我的主要目标是删除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,并且应用崩溃。

为什么再次返回该方法?还是我缺少同步方面的东西?我确实有另一个按钮,该按钮在使用“用户信息”并且需要更改活动时结束。

1 个答案:

答案 0 :(得分:1)

之所以有此行为,是因为您使用的是bx而不是addValueEventListener方法。大多数情况下,两者都做相同的事情,但有区别,addListenerForSingleValueEvent在获取数据后立即断开连接,而addListenerForSingleValueEvent则继续监听。

要解决这个问题,请使用addValueEventListener方法或remove the listener according to the life-cycle of your activity