【问题标题】:Is there any chance DataSnapshot value is null?DataSnapshot 值是否有可能为空?
【发布时间】:2017-01-06 19:15:56
【问题描述】:

我正在回答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 (firstDataSnapshot != null && secondDataSnapshot != null) 那样验证它,而不是像这样验证if (firsCallDone && secondCallDone)。那是因为据我所知,DataSnapshot 从不 null(在其值被填充到 onDataChange() 之后)。

但我不确定。 onDataChange() 中的 DataSnapshot 是否有可能为空?如果有,是什么情况导致它发生?

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    DataSnapshot 永远不能为空,无论那里是否有数据(因为如果没有数据,您将获得一个空但非空的 DataSnapshot)。

    【讨论】:

    【解决方案2】:

    不,DataSnapshot 的值永远不会是 null

    如果发生任何故障,将触发onCancelled()方法。

    顺便说一句,您应该利用 Tasks API 来管理这些任务,而不是创建标志来确保每个侦听器都已完成。 This answer from a Firebaser 对此进行了解释,并为此提供了一个类。

    干杯:)

    【讨论】:

    • 嘿Wilik:DataSnapshot 永远不会为空,即使没有值也不会。 DataSnapshot.getValue() 可能会返回 null,但快照本身将始终是有效对象。这就是为什么您可以例如在其上调用snapshot.exists(),以查看您查询的位置是否有值。
    • 感谢@FrankvanPuffelen 的更正。在我的回答中,我所指的“DataSnapshot 的价值”确实是DataSnapshot.getValue(),但我只是意识到这不是我重新阅读问题后提问者的意思。我将编辑我的答案。 :)
    • 是的。当我意识到问题与快照对象本身有关时,我也在路上提供基于getValue() 的答案。因此,我把迈克尔拉进来寻求更权威的答案。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 2010-09-05
    相关资源
    最近更新 更多