首页 > 解决方案 > 为什么我的 addListenerForSingleValueEvent 停止从 Android 应用程序中的 Firebase 数据库读取数据?

问题描述

我正在将数据保存到 Firebase 数据库中以验证我使用我使用dataSnapshot过的 Button 的点击侦听器从数据库中读取数据的几个条件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

标签: javaandroidfirebase

解决方案


数据从 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,你告诉它转到下一条语句,它会转到 line 2。到目前为止一切顺利,因为这可能是我们所期望的。

如果您然后从 line2告诉调试器转到下一条语句,它将跳转到 line 10。原因是第 2 行启动了一个异步操作,这需要一些时间才能完成。因此,调试器继续执行异步助手类之后的语句,该类位于 line 10

如果要查看是否onDataChange被调用,则需要在该方法内部的第一行设置断点,5在这种情况下为 line。一旦调试器命中该断点,您可以使用通常的“下一条语句”指令继续单步执行该方法。


推荐阅读