java - 为什么我的 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
解决方案
数据从 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。一旦调试器命中该断点,您可以使用通常的“下一条语句”指令继续单步执行该方法。
推荐阅读
- javascript - 输入后需要获取coffeescript的数据
- python - Python读取文件然后转换成矩阵
- swift - HKObjectQuery 不会停止
- ios - 不平衡在模态存在时调用警告,然后导航弹出到根完成
- r - 使用dplyr求和并除以重复总数?
- business-catalyst - Adobe Business 催化剂联系表通知电子邮件已更改
- ios - 首先滑动/向下滚动将消失视图
- android - 使用 facebook AdView 查找呈现的横幅的 WebView - 通过反射
- angular - Internet Explorer 正在删除我的 Angular 应用程序的上下文根?有什么办法可以避免?
- asp.net-core - 如何在 ASP Net Core 2.0 MVC Web 应用程序和 Azure AD 之间强制重新身份验证