我正在回答this question然后我想到了这个新问题。
在那个问题中,我描述了我的示例代码:
boolean firstCallDone = false;
boolean secondCallDone = false;
DataSnapshot firstDataSnapshot = null;
DataSnapshot secondDataSnapshot = null;
onCreate() {
firstRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
firstCallDone = true;
firstDataSnapshot = dataSnapshot;
if (firsCallDone && secondCallDone)
doSomething();
}
...
}
secondRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
secondCallDone = true;
secondDataSnapshot = dataSnapshot;
if (firsCallDone && secondCallDone)
doSomething();
}
...
}
}
doSomething() {
// do something with firstDataSnapshot and secondDataSnapshot
...
}
上述代码的目的是在调用两个Firebase数据库并获取其值后执行doSometing()
。
然后我意识到,我可以像if (firsCallDone && secondCallDone)
一样验证它,而不是像if (firstDataSnapshot != null && secondDataSnapshot != null)
那样进行验证。这是因为据我所知,DataSnapshot 从不 null(在onDataChange()
内填充其值之后)。
但我不确定。在onDataChange()
内DataSnapshot是否有可能为null?如果有的话,那会是什么情况呢?
答案 0 :(得分:2)
DataSnapshot永远不能为null,无论是否有数据(因为如果没有数据,你将得到一个空的但非空的DataSnapshot)。
答案 1 :(得分:1)
不,DataSnapshot
值永远不会是null
。
如果发生任何故障,将触发onCancelled()
方法。
顺便说一下,您应该利用Tasks API来管理这些任务,而不是创建标志以确保每个侦听器都已完成。 This answer from a Firebaser解释了这一点,并为此提供了一个类。
干杯:)