Цикл пытается удалить учетную запись в базе данных Firebase - PullRequest
0 голосов
/ 21 декабря 2018

Моя главная цель - удалить учетную запись как в 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(), но, поскольку у нее нет экземпляра User, метод getEmail() возвращает null, и приложение вылетает.

Почему он снова возвращает метод?Или в синхронизации есть что-то, чего мне не хватает?У меня есть еще одна кнопка, которая заканчивается, когда используется информация о пользователе, и она должна изменить активность.

1 Ответ

0 голосов
/ 21 декабря 2018

У вас такое поведение, потому что вы используете addValueEventListener метод вместо addListenerForSingleValueEvent.Большинство из них делают одно и то же, но есть разница: addListenerForSingleValueEvent отключается сразу после получения данных, в то время как addValueEventListener продолжает слушать.

Так что, чтобы справиться с этим, используйте метод addListenerForSingleValueEvent или удалить слушателя в соответствии с жизненным циклом вашей деятельности .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...