why Does my addListenerForSingleValueEvent stop reading data from Firebase database in android application?

时间:2019-04-17 01:27:40

标签: java android firebase

I'm saving Data into Firebase Database to verify few condition I read data from database using dataSnapshot inside Button's click listener that I have used addListenerForSingleValueEvent. So when I run my application and try to cick that button addListenerForSingleValueEvent block skip whole query. What is wrong I am not getting with code as not showing any error or crashing application. Below is my code:

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 Structure Below Image Show Database Structure https://i.stack.imgur.com/mAt4L.png

1 个答案:

答案 0 :(得分:2)

从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上设置一个断点。一旦调试器达到该断点,您就可以使用通常的“ next statement”指令继续逐步执行该方法。