Firebase 离线功能导致内存问题

Firebase offline capabilities causing memory problems

我正在开发一个使用 firebase 数据库存储数据的聊天应用程序。开发聊天应用程序时的常用方法是保持数据库节点同步,以便您可以离线访问消息。因此,当我实施 firebase 离线功能以保持数据节点同步时,问题就出现了。 Firebase 建议离线访问数据的两个必需步骤:

启用磁盘持久性

这是根据文档通过使用这行代码启用的(在我的例子中,我将其添加到应用程序 class):

FirebaseDatabase.getInstance().setPersistanceEnabled(true);

保持节点同步

只需将 keepsynced(true) 添加到您希望保持同步的任何数据库引用即可启用此功能,如下所示:

ChatNode.keepSynced(true);

两者有什么区别?

根据 firebase 团队在此站点上的回答,我推断:

1)(Disk persistance)将数据存储在设备磁盘上,需要时使用,写入数据或读取数据都存储数据

a)如果离线写入数据:数据存储在磁盘上,再次上线时发送到数据库。

b)如果离线读取数据:在线读取的监听器保存在磁盘存储,您将可以从磁盘离线读取。

2)(保持同步为真)将以两种方式保持数据库引用同步:

a) 如果您还使用(磁盘持久性)和(保持同步),您将能够在磁盘上保持数据同步......这似乎是默认设置(磁盘持久性)的行为。

b) 如果您单独使用(保持同步),那么您只存储到所谓的应用内存中。

问题

我确实设置了这两种方法,但我的应用程序现在非常滞后和缓慢,有时会自行停止。

问题

如果我上面说的都是真的,那么这种离线功能的方法会不会对我的应用造成沉重的负担?

如果我让很多监听器保持同步并启用持久化,那么磁盘会不会装满数据?我应该清理数据吗?这两种方式都是磁盘数据自己清理的吗?数据是自己从内存中清除的吗?

我想避免在我的应用程序中出现滞后和缓慢的响应,感谢您的帮助。

您的假设是正确的。如果您使用 FirebaseDatabase.getInstance().setPersistenceEnabled(true); 意味着 Firebase 将创建您的数据库的本地副本,这也意味着您离线时所做的每项更改都将添加到 queue。因此,随着此队列的增长,本地操作和应用程序启动将变慢。所以速度取决于那个队列的维度。但请记住,Firebase 被设计为一个在线数据库,可以在断开连接的短到中间时间内工作,而不是作为一个离线数据库。

其次,如果使用了很多侦听器,请不要忘记根据 activity 的生命周期相应地删除侦听器,如下所示:

databaseReference.removeEventListener(valueEventListener);