gpt4 book ai didi

java - get() 和 addListenerForSingleValueEvent 有什么区别?

转载 作者:行者123 更新时间:2023-12-03 11:18:01 26 4
gpt4 key购买 nike

我看到很多关于在 Android 上使用 Firebase 实时数据库的教程、文档和问题都在谈论 addListenerForSingleValueEvent方法。这种方法从数据库中读取一次值,这就是我想要做的。
但是在我的 IDE 和文档中的自动完成中,我还看到了一个名为 get() 的方法。 ,这似乎也从数据库中读取了一次值。从名称和签名来看,它似乎更简单、更现代(因为它返回一个 Task )。但是由于提到了很多其他方法,所以我想确保我使用的是正确的代码。
那么 get() 和有什么区别?和 addListenerForSingleValueEvent ,为什么在文档、教程和问题中更多地提到了后者,当我想从数据库中读取一次值时应该使用哪一个?

最佳答案

首先:请记住,Firebase 实时数据库最适合通过使用长生命周期监听器来保持客户端和数据库服务器(或多个客户端之间)之间的数据同步。在 Android 上,您可以使用 addValueEventListener ,您应该尽可能尝试使用它。
但在某些情况下,您只想从数据库中读取一次值。那么让我们看看我是否可以依次回答问题,从最重要的一个开始:
当我想从数据库中读取一次值时应该使用哪种方法?
如果您只需要从数据库中读取一次值,请使用新的 get()方法。
在 Java 中看起来像这样:

ref.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (!task.isSuccessful()) {
            Log.e("firebase", "Error getting data", task.getException());
        }
        else {
            Log.d("firebase", String.valueOf(task.getResult().getValue()));
        }
    }
});
在 Kotlin 中是:
ref.get().addOnSuccessListener {
    Log.i("firebase", "Got value ${it.value}")
}.addOnFailureListener{
    Log.e("firebase", "Error getting data", it)
}
为什么推荐使用 get()addListenerForSingleValueEvent提到这么多?
我们介绍了 addListenerForSingleValueEvent在我们的第一个 Android SDK 中,它一直存在。多年来,已经编写了很多教程,并且提出了很多问题并得到了解答。
当然,我们正在更新文档。但是我们无法更新所有教程。因此,在可预见的 future , addListenerForSingleValueEvent 的提及次数将会更多。比新的 get()方法。 get() 和有什么区别和 addListenerForSingleValueEvent ?
如前所述: addListenerForSingleValueEvent只要它存在,方法就一直是 Firebase Android SDK 的一部分,并用于从数据库中读取一次值。它通过以下方式做到这一点:
  • 使用 addValueEventListener 附加监听器
  • 等待值从持久层显示
  • 调用onDataChange
  • 移除监听器

  • 这工作得非常好......直到我们在 SDK 2.0 版中引入磁盘缓存(早在 I/O 2015)。在此之前,步骤 2 中的所有值将始终来自服务器,因为客户端已经有一个监听器,或者因为这会将第一个监听器附加到服务器。但是对于磁盘缓存,如果您之前读取了该值但当前没有监听器,则步骤 2 将从磁盘缓存中读取该值,并且您的 onDataChange将立即使用该值调用。即使服务器上的值已经更新。事实上,监听器会在后台更新磁盘缓存中的值,但只有在调用你的 onDataChange 之后才会更新。使用缓存中的(可能是陈旧的)值。
    虽然可以解释这种行为,但这并不是几乎所有人想要的。不幸的是,我们发现这种边缘情况为时已晚,无法将其归类为简单的实现错误并进行修复。所以我们把它留在里面,并建议人们要么使用磁盘持久性,要么使用 addListenerToSingleValueEvent ,但不是两者兼而有之。或者您可以调用 keepSynced(true)在与解决方法相同的引用/查询上。一切都乱七八糟,而且不好。
    快进 5 年多,我们终于推出了一种不再有这种尴尬行为的新方法。由于自 2015 年以来 Android API 已经有了很大的发展,我们还使用了(稍微)更现代的方法签名: Task<DataSnapshot> get() .

    关于java - get() 和 addListenerForSingleValueEvent 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66072471/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com