我正在开发一个Android应用程序,该应用程序使用 很多 来自并指向我的Firestore数据库的数据。
这是我所做的概述。
用途:我在文档和集合上设置了侦听器,并使用了get
方法;
用途:我存储文档,使用和不使用set
,我也更新文档。
就目前而言,每次执行上述任何操作时,我都会实例化一个名为SetupFirebaseFirestore
的类。这是一个AsyncTask
,用于初始化Firestore。完成后,它还会执行一个回调(当我实例化SetupFirebaseFirestore
时给出)。
您可以在下面找到代码:
public class SetupFirebaseFirestore extends AsyncTask<Void, Void, Void> {
private SetupFirebaseFirestorePostExecuteCallback post_execute_callback;
private FirebaseFirestore db;
public SetupFirebaseFirestore(SetupFirebaseFirestorePostExecuteCallback callback) {
post_execute_callback = callback;
}
private void createFirebaseProducts() {
db = FirebaseFirestore.getInstance();
db.setFirestoreSettings(new FirebaseFirestoreSettings.Builder()
.setTimestampsInSnapshotsEnabled(true)
.build());
}
@Override
protected Void doInBackground(Void[] params) {
createFirebaseProducts();
return null;
}
@Override
protected void onPostExecute(Void result) {
post_execute_callback.onTaskCompleted(db);
}
}
问题是我的应用程序与Firestore进行了 很多 交互。因此,有很多Firestore实例,因此会消耗大量RAM。
顺便说一句,也许由于我调用getInstance()
和build()
导致Firestore过载了?
如何在RAM消耗方面做些更干净的事情?我应该使用单例模式吗?它可以让我实例化一次Firestore,并对其进行设置相同。
答案 0 :(得分:1)
Firebase数据库客户端已经在后台线程中运行所有网络操作。这意味着所有操作都在不阻塞主线程的情况下进行。将操作放在AsyncTask
中不会带来任何其他好处。更进一步,实例化其中的FirebaseFirestore
对象将完全没有帮助。与Cloud Firestore数据库进行交互时,将打开您的应用程序与Firebase服务器之间的套接字连接。从那一刻起,应用程序和数据库之间的所有流量都通过同一套接字传输。因此,无论您打getInstance()
多少次,都始终只有一个连接。
如果一段时间内没有活动的侦听器,Cloud Firestore客户端将自动关闭连接,但是当您连接侦听器或再次执行读/写操作时,它将重新打开连接。
因此,连接多少次或侦听器多少都无关紧要,而在客户端上处理多少数据则无关紧要。并回答您的问题:
如何与Firestore进行交互以减少客户端的RAM消耗?
减少您在单个查询中获得的文档数量。查询性能取决于您请求的项目数,而不取决于您从中请求的项目数。要获取较小的数据块,请参阅: