【发布时间】:2016-09-24 13:19:02
【问题描述】:
我一直在使用 firebase 数据库编写应用程序,在过去的两天里,它不起作用。
我的意思是我有一个到数据库的连接,但是当我尝试通过设置addListenerForSingleValueEvent 读取信息时,即使我updateChildren,它也不会运行ValueEventListener。
DatabaseReference mBlaze = FirebaseUtil.getDatabase(PLACES);
mBlaze.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot snapShot : dataSnapshot.getChildren()) {
System.out.println("Hello");
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("Error");
}
});
long sTime = System.currentTimeMillis();
while (!triggers[0])
if (System.currentTimeMillis() - sTime > 5000)
我在用于运行addListenerForSingleValueEvent 的数据库中有一个触发器值。
如果我尝试在我的设备\模拟器上运行它,它不会打印出消息“Hello”,也不会打印出消息“错误”。
这是一个问题的原因是我正在尝试针对 firebase 数据库验证代码。
我给它一个 5 秒的时间窗口来改变值,这意味着找到了代码,如果 5 秒后triggers[0] 的值没有改变,则意味着代码无效。
在我尝试减少代码的过程中,我偶然发现了setLogLevel,在我将它与Level.DEBUG 一起使用后,我发现这条线一遍又一遍地出现:
获取令牌时出错:用户的凭据不再有效。用户必须重新登录。
【问题讨论】:
-
首先,
ValueEventListener应该在没有调用updateChildren的情况下运行。其次,您是否检查过onCancelled是否被调用? -
抱歉,我很难理解您看到的行为与预期的行为。您能否将代码缩减为 MCVE 并在运行代码之前包含 JSON(作为文本,无屏幕截图)?
-
@TheSunshinator
onCancelled没有被调用。 @FrankvanPuffelen 我减少了代码,但我怀疑它会导致同样的问题\缺少与您的连接。请注意,我在尝试减少代码时发现了一个错误。 -
其实
while循环可以防止ValueEventListener被触发。我有一个类似的问题,我有一个while(true) if(isTriggered) break;,它似乎比ValueEventListener更重或在处理器上具有更高的优先级,因此它从未被触发并且我的程序冻结了。您应该使用interface进行回调。
标签: java android firebase firebase-realtime-database