Данные загружаются из Firebase асинхронно, что делает невозможным использование метода, подобного boolean validateEmail(String email)
на Android.Загрузка данных из базы данных должна быть блокирующей операцией, чтобы включить такой метод, и Android не позволяет блокировать операции (так как это приведет к неработоспособности телефона).
Так что вместо этого вы должны * либо(переместите код для создания пользовательского в validateEmail
или передачи в пользовательском интерфейсе, который затем вызывается после возвращения результата из базы данных. Код для последнегониже.
Сначала мы создадим пользовательский интерфейс, который вы можете реализовать в любом месте, где вам нужно проверить, существует ли пользователь.
public interface UserExistsCallback {
void onCallback(boolean value);
}
Этот интерфейс может быть как конкретным, так и общимвы хотите. Это очень похоже на ValueEventListener
в Firebase, но этот интерфейс предназначен только для вашего собственного использования.
С помощью этого интерфейса мы можем определить метод validateEmail
следующим образом:
private void validateEmail(String email, final UserExistsCallback callback) {
isValid = true;
databaseUser.orderByChild("email").equalTo(emailUserEntered)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
callback.onCallback(dataSnapshot.exists())
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException();
}
});
}
И затем вызвать его из onCreateAccount
следующим образом:
public void onCreateAccount(View view){
String email = etEmail.getText().toString().trim();
validateEmail(email), new UserExistsCallback() {
public void onCallback(boolean exists) {
if (!exists) {
String id = databaseUser.push().getKey();
User user = new User(id, email);
databaseUser.child(user.getId()).setValue(user);
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.putExtra("isCreateAccount", true);
startActivityForResult (intent,0);
}
})
}
}
Также см. Многие из (связанных) ответов ниже: