Порядок выполнения запроса Firebase неверен

#android #firebase #firebase-realtime-database

#Android #firebase #firebase-база данных в реальном времени

Вопрос:

Я использую firebase, и мне нужно проверить, существует ли имя пользователя, я использую Query для проверки всех имен пользователей, и если я нашел то же имя пользователя, оно не будет продолжать создавать учетную запись. но по какой-то причине Query выполняется, хотя я могу в отладчике, что он вводит запрос, возможно, запрос выполняется в конце или что-то в этом роде, а не в порядке кода.

Надеюсь, вы сможете мне помочь, вот фрагмент моего кода:

кстати, фрагмент находится в AlertDialog, если это имеет значение.

   btnCreate.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    errorFlag = 0;

                    txtNote = (TextView) view.findViewById(R.id.note);
                    txtEmailReg = (EditText) view.findViewById(R.id.txtEmailReg);
                    txtPassReg = (EditText) view.findViewById(R.id.txtPassReg);
                    txtRepassReg = (EditText) view.findViewById(R.id.txtRepassReg);
                    txtUsernameReg = (EditText) view.findViewById(R.id.txtUsername);

                    final ArrayList<String> Users = new ArrayList<String>();
                    Query query = mDatabaseReference.child("users").orderByKey();
                    query.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                                String userName = snapshot.getValue((User.class)).username;
                                Users.add(new String(userName));
                            }
                            if (Users.size() > 0) {
                                for (int i = 0; i < Users.size(); i  ) {
                                    if (txtUsernameReg.getText().toString().equals(Users.get(i))) {
                                        Toast.makeText(LoginActivity.this, "username exists", Toast.LENGTH_SHORT);
                                        errorFlag = 1;
                                    }
                                }
                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }

                    });

                    if (errorFlag == 0) {
                        if (txtRepassReg.getText().toString().length() == 0 || txtEmailReg.getText().toString().length() == 0 || txtPassReg.getText().toString().length() == 0
                                || txtUsernameReg.getText().toString().length() == 0) {
                            errorFlag = 1;
                            txtNote.setText("one empty field");
                        }

                        if (!(txtRepassReg.getText().toString().equals(txtPassReg.getText().toString()))) {

                            errorFlag = 1;
                            txtNote.setText("password doesn't match");
                        }

                        if (errorFlag == 0) {
                            CreateAcc(txtEmailReg.getText().toString(), txtPassReg.getText().toString(), dialog,
                                    txtUsernameReg.getText().toString());
                        }
                    }
                }


            });
  

Комментарии:

1. Из того, что я знаю о firebase, он работает с моделью подписки на основе событий для данных, поэтому перед тем, как запрос получит ответ (что происходит асинхронно), достигается блок if, и к тому времени значение errorFlag не изменилось.

2. Сохраняете ли вы имена пользователей для успешно зарегистрированных пользователей в базе данных firebase? Если да, то я могу предложить вам код, который работает, поскольку я также сделал то же самое в своем проекте firebase.

3. @IshanKhanna, как вы описали, так что я могу сделать, чтобы это исправить?