android - Firebase Android : What is the difference between getting callback from DatabaseReference's setValue via Task and DatabaseReference. CompletionListener?

标签 android firebase firebase-realtime-database

我使用的是后 Google I/O 2016 Firebase 数据库。

DatabaseReference 上,有两个类似的方法,似乎只是完成回调不同。

一个是void setValue(Object value, DatabaseReference.CompletionListener listener) , 另一个是 Task<Void> setValue(Object value) .

它们可以互换吗?文档对此没有任何说明,而且 Firebase Android SDK 是闭源的。

最佳答案

它们几乎可以互换。 setValue 返回的 Task 与传递的 CompletionListener 之间的主要区别在于能够避免对象泄漏。

当您将 CompletionListener 传递给 setValue 时,Firebase SDK 将无限期保留该对象引用(以及所有对象的强引用,等等),直到数据最终写入服务器端。对于 Android 应用程序,这可能特别成问题,因为您最终可能会泄漏 Activity 引用,这是非常昂贵的。

当您使用任务时,您可以根据需要在那个中添加和删除监听器,因此如果您不再想知道写入是否成功,您可以释放以前感兴趣的对象。在 Android 中,有用于添加监听器的重载,当 Activity 停止时自动让监听器自行删除,因此您不必自己安排这样做。

借助 Tasks,您还可以安排在特定执行器上调用回调,这是将繁重的工作转移到另一个线程的便捷方式。使用 CompletionListener,您必须在回调本身中自行安排。

我有一个 four-part blog series在 Play 服务和 Java admin SDK 提供的任务上。还有formal documentation .

关于android - Firebase Android : What is the difference between getting callback from DatabaseReference's setValue via Task and DatabaseReference. CompletionListener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42432558/

相关文章:

Android软键盘-需要Android软键盘源码AOSP

android - ExoPlayer - 在整个音频剪辑播放过程中显示 PlayerControlView

Android push c2dm 无法使用 200 ok 响应

javascript - 如何从嵌套组件发出,同时保持引用函数外部变量的能力

java - 我是否需要关闭 addOnSuccessListener 才能保存到数据库(setValue)?

android - 从 Android 中的 Firebase 子项检索单个值

android - 使用 GeoPoint 测量步行距离并向用户显示距离

android - 我可以为两个不同的应用程序使用相同的 Firebase 吗?

ios - 在 Firebase 中使用事务

ios - 函数不会运行所有行