Почему мой addListenerForSingleValueEvent прекращает чтение данных из базы данных Firebase в приложении для Android? - PullRequest
0 голосов
/ 17 апреля 2019

Я сохраняю данные в базе данных Firebase, чтобы проверить несколько условий, при которых я считываю данные из базы данных, используя dataSnapshot внутри приемника нажатия кнопки, который я использовал addListenerForSingleValueEvent. Поэтому, когда я запускаю свое приложение и пытаюсь нажать на эту кнопку, блок addListenerForSingleValueEvent пропускает весь запрос. Что не так, я не получаю с кодом, так как не отображаются какие-либо ошибки или сбой приложения. Ниже мой код:

btnCreate_Account.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        final String mobileverify =  phonenumber.getText().toString();
        dbuser = FirebaseDatabase.getInstance().getReference("Passanger");
        dbuser.addListenerForSingleValueEvent(new ValueEventListener() {

            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot datas : dataSnapshot.getChildren()) {
                    String dbmobileno = datas.child("mobileno").getValue().toString();
                    if (TextUtils.isEmpty(mobileverify)) {
                        Toast.makeText(RegistrationActivity.this, "Please Enter Mobile No", 
                        Toast.LENGTH_LONG).show();
                        return;
                    } else {
                        if (mobileverify.equals(dbmobileno)) {
                            //Check if Same Mobile Number Registered or Not
                            phonenumber.getText().clear();
                            Toast.makeText(RegistrationActivity.this, "Mobile No Already Registered!!!", Toast.LENGTH_LONG).show();
                            break;
                        } else if (!mobileverify.equals(mobileverify)){
                            //do something
                            btnCreate_Account.setEnabled(false);
                            AddUserRegistration();
                            Toast.makeText(RegistrationActivity.this, "Please Enter New Mobile Number !!", Toast.LENGTH_LONG).show();
                            break;
                        }
                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });
    }
}

2. Структура FireBaseDataBase Ниже изображение Показать структуру базы данных https://i.stack.imgur.com/mAt4L.png

1 Ответ

2 голосов
/ 18 апреля 2019

Данные загружаются из Firebase асинхронно.Пока данные загружаются, основной поток продолжает выполнять основной код.Затем, когда данные загружены, вызывается ваш метод onDataChanged.

Все это означает, что в этом случае вы не можете войти в onDataChange с помощью отладчика.

Давайте быстропосмотрите, что это значит в отладчике.Я пронумеровал самые важные строки:

/* 1 */    dbuser = FirebaseDatabase.getInstance().getReference("Passanger");
/* 2 */    dbuser.addListenerForSingleValueEvent(new ValueEventListener() {
/* 3 */        @Override
/* 4 */        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
/* 5 */            for (DataSnapshot datas : dataSnapshot.getChildren()) {
/* 6 */                String dbmobileno = datas.child("mobileno").getValue().toString();
               ...
/* 7 */        public void onCancelled(@NonNull DatabaseError databaseError) {
/* 8 */        }
/* 9 */    });
/*10 */    System.out.println("Got here");

Если вы находитесь в отладчике, который остановлен на строке 1, и вы указываете ему перейти к следующему утверждению, оно перейдет к строке 2.Пока все хорошо, поскольку это, вероятно, то, чего мы все ожидали.

Если вы затем из строки 2 скажете отладчику перейти к следующему оператору, он перейдет к строке 10.Причина в том, что строка 2 запускает асинхронную операцию, выполнение которой займет некоторое время.Таким образом, отладчик продолжает оператор после асинхронного вспомогательного класса, который находится в строке 10.

Если вы хотите увидеть, вызывается ли onDataChange, вам нужно установитьточка останова на первой строке внутри этого метода, поэтому строка 5 в этом случае.Как только отладчик достигнет этой точки останова, вы можете продолжить выполнение этого метода с помощью обычной инструкции «следующий оператор».

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