是否有可能数据快照值为空



我正在回答这个问题,然后我想到了这个新问题。

在这个问题中,我这样描述我的示例代码:

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的这个答案对此进行了解释,并为此提供了一个类。

干杯:)

最新更新