该程序需要验证我的 firebase 数据库中是否存在某些内容
我的问题是我需要单击按钮两次才能执行 ValueEventListener。第一次在没有验证的情况下进入另一个活动并工作时,我需要按模拟器中的返回按钮,然后再次按搜索按钮(意图按钮)。
search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
databaseReference.child("calendar").child("adrian").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.hasChild(month1.toLowerCase(Locale.ROOT))) {
for (int i = Integer.parseInt(date1); i <= Integer.parseInt(date2); i++) {
if (snapshot.child(month1.toLowerCase(Locale.ROOT)).hasChild(String.valueOf(i))) {
x++;
}
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
Intent intent = new Intent(MainActivity.this,Image.class);
intent.putExtra("x",String.valueOf(x));
startActivity(intent);
}
});
My problem is that i need to click twice on my button to execute the ValueEventListener. The first time it goes to another activity without the verification and to work i need to press the return button in emulator and then press again on the search button(intent button).
search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
databaseReference.child("calendar").child("adrian").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.hasChild(month1.toLowerCase(Locale.ROOT))) {
for (int i = Integer.parseInt(date1); i <= Integer.parseInt(date2); i++) {
if (snapshot.child(month1.toLowerCase(Locale.ROOT)).hasChild(String.valueOf(i))) {
x++;
}
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
Intent intent = new Intent(MainActivity.this,Image.class);
intent.putExtra("x",String.valueOf(x));
startActivity(intent);
}
});
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
问题在于对 Firebase(以及大多数云 API)的调用是异步的,它们允许您的主代码在后台加载数据时继续运行。然后,一旦数据可用,您的
onDataChange
就会被调用。实际上,这意味着您的
intent.putExtra("x",String.valueOf(x));
在x++
被调用之前运行良好,您可以最轻松地验证这一点通过在调试器中运行,或放置一些日志语句。解决方案是,所有需要数据库数据的代码都必须位于
onDataChange
内部,从那里调用,或者以其他方式同步。所以最简单的修复:The problem is that calls to Firebase (and most cloud APIs) are asynchronous, and they allow your main code to continue while loading the data in the background. Then once the data is available, your
onDataChange
is called.In practice this means that your
intent.putExtra("x",String.valueOf(x));
runs well beforex++
ever gets called, something you can most easily verify by running the in a debugger, or placing some log statements.The solution for this is that all code that needs the data from the database must be inside
onDataChange
, be called from there, or be otherwise synchronized. So the simplest fix:Also see: