get() 和 addListenerForSingleValueEvent 之间有什么区别?

互联网 更新时间:2023-04-26 21:02:01

Fra*_*len 6

首先:请记住,Firebase 实时数据库最适合用于通过使用长期监听器在客户端和数据库服务器之间(或多个客户端之间)保持数据同步。在 Android 上addValueEventListener,您可以使用 来执行此操作,您应该尽可能尝试使用它。

但在某些情况下,您只希望从数据库中读取一个值一次。那么让我们看看我是否可以依次回答这些问题,从最重要的一个开始:

当我想从数据库中读取一次值时应该使用哪种方法?

如果您只需要从数据库中读取值一次,请使用新get()方法。

在 Java 中看起来像这样:

ref.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (!task.isSuessful()) {
            Log.e("firebase", "Error getting data", task.getException());
        }
        else {
            Log.d("firebase", String.valueOf(task.getResult().getValue()));
        }
    }
});

在 Kotlin 中,它是:

ref.get().addOnSuessListener {
    Log.i("firebase", "Got value ${it.value}")
}.addOnFailureListener{
    Log.e("firebase", "Error getting data", it)
}

为什么你推荐使用get()whenaddListenerForSingleValueEvent被提及得更多?

我们addListenerForSingleValueEvent在我们的第一个 Android SDK 中引入了它,从那时起它就一直存在。这些年写了很多教程,也提出了很多问题,也解答了很多问题。

我们当然正在更新文档。但是我们无法更新所有教程。因此,在可预见的未来,提及addListenerForSingleValueEventget()方法的次数将多于提及。

之间有什么区别get()addListenerForSingleValueEvent

如前所述:该addListenerForSingleValueEvent方法自存在以来一直是 Firebase Android SDK 的一部分,并用于从数据库中读取一次值。它通过以下方式做到这一点:

附加一个监听器 addValueEventListener 等待值从持久层显示出来 打电话 onDataChange 移除监听器

这非常有效……直到我们在 SDK 2.0 版中引入了磁盘缓存(早在 I/O 2015)。在此之前,第 2 步中的所有值将始终来自服务器,因为客户端已经有一个侦听器,或者因为这会将第一个侦听器附加到服务器。但是对于磁盘缓存,如果您之前读取过该值但当前没有侦听器,则步骤 2 将从磁盘缓存中读取该值,并且您onDataChange将立即使用该值调用您。即使服务器上的值已经更新。实际上,在幕后,侦听器将更新磁盘缓存中的值,但只有在使用缓存中onDataChange的(可能是陈旧的)值调用您之后。

虽然可以解释这种行为,但它几乎不是任何人想要的。不幸的是,我们发现这种边缘情况为时已晚,无法将其归类为简单的实现错误并进行修复。所以我们保留了它,并建议人们要么使用磁盘持久性要么使用addListenerToSingleValueEvent,但不能同时使用。或者您可以调用keepSynced(true)相同的参考/查询作为解决方法。都是乱七八糟的,不好。

快进 5 年多,我们终于推出了一种不再有这种尴尬行为的新方法。而且由于 Android API 自 2015 年以来发生了相当大的变化,我们还使用了(稍微)更现代的方法签名:Task<DataSnapshot> get().

惊人的!对我来说,这也使代码更清晰、更易于理解。 (2认同)

更多推荐

有什么区别,addListenerForSingleValueEvent

本文发布于:2023-04-26 21:02:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/hyzx/da2ac87e68cea4085220c3b924966c33.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:有什么区别   addListenerForSingleValueEvent

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 89740文章数
  • 23105阅读数
  • 0评论数