Firebase脱机功能导致内存问题

时间:2017-11-09 21:54:31

标签: android firebase firebase-realtime-database offline-caching

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

启用磁盘持久性

根据文档使用这行代码启用(在我的情况下,我将其添加到应用程序类中):

FirebaseDatabase.getInstance().setPersistanceEnabled(true);

保持节点同步

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

ChatNode.keepSynced(true);

两者有什么区别?

根据firebase团队在本网站上的回答,我推断出:

1)(磁盘持久性)将数据存储在设备磁盘上以便在需要时使用它们,并且在您写入数据或读取数据时存储数据。

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

b)如果您离线读取数据:在线阅读并保存在磁盘中并存储的侦听器,您将能够从磁盘脱机读取它。

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

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

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

问题

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

问题

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

如果我让许多侦听器同步并启用了持久性,那么磁盘是否会充满数据?我应该清理数据吗?磁盘上的数据是否在两种方法中都自行清除?数据是从内存中自行清除的吗?

我希望避免我的应用中的滞后和缓慢响应,感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

其次,如果使用了很多听众,请不要忘记根据活动的生命周期删除听众:

databaseReference.removeEventListener(valueEventListener);
相关问题