我正在使用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中,添加侦听器的重载会在活动停止时自动让侦听器删除自身,因此您不必自己去做。

使用Tasks,您还可以安排在特定的Executor上调用您的回调,这是将大量工作投入另一个线程的便捷方法。使用CompletionListener,您必须自己在回调本身中进行安排。

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

07-24 09:25