如何与Firestore进行交互以减少客户端的RAM消耗?

时间:2019-02-10 18:58:44

标签: java android firebase google-cloud-firestore

我正在开发一个Android应用程序,该应用程序使用 很多 来自指向我的Firestore数据库的数据。

这是我所做的概述。

  1. 用途:我在文档和集合上设置了侦听器,并使用了get方法;

  2. 用途:我存储文档,使用和不使用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,并对其进行设置相同。

1 个答案:

答案 0 :(得分:1)

Firebase数据库客户端已经在后台线程中运行所有网络操作。这意味着所有操作都在不阻塞主线程的情况下进行。将操作放在AsyncTask中不会带来任何其他好处。更进一步,实例化其中的FirebaseFirestore对象将完全没有帮助。与Cloud Firestore数据库进行交互时,将打开您的应用程序与Firebase服务器之间的套接字连接。从那一刻起,应用程序和数据库之间的所有流量都通过同一套接字传输。因此,无论您打getInstance()多少次,都始终只有一个连接。

如果一段时间内没有活动的侦听器,Cloud Firestore客户端将自动关闭连接,但是当您连接侦听器或再次执行读/写操作时,它将重新打开连接。

因此,连接多少次或侦听器多少都无关紧要,而在客户端上处理多少数据则无关紧要。并回答您的问题:

  

如何与Firestore进行交互以减少客户端的RAM消耗?

减少您在单个查询中获得的文档数量。查询性能取决于您请求的项目数,而不取决于您从中请求的项目数。要获取较小的数据块,请参阅: