我正在回答这个问题,然后我想到了这个新问题。
在这个问题中,我这样描述我的示例代码:
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 永远不会为空(在其值填充到 onDataChange()
中之后)。
但我不确定。数据快照在onDataChange()
内是否有可能为空?如果有,是什么情况使它发生?
无论那里是否有数据,DataSnapshot 都不能为空(因为如果没有数据,您将获得一个空但非空的 DataSnapshot)。
不,DataSnapshot
值永远不会null
。
如果发生任何故障,将改为触发onCancelled()
方法。
顺便说一下,与其创建标志来确保每个侦听器都已完成,不如利用任务 API 来管理这些任务。Firebaser的这个答案对此进行了解释,并为此提供了一个类。
干杯:)