ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android – Firestore文件的get()性能

2019-06-22 13:13:22  阅读:164  来源: 互联网

标签:android firebase google-cloud-firestore


刚刚开始探索Firestore存储和首先要做的事情 – 通过文档密钥在我的Android应用程序中读取一个简单的小文档(通过Google验证,但可能并不重要).这是一个片段:

public void readDoc(final String key) {
  final long start = System.currentTimeMillis();
  docsCollection.document(key).get().addOnCompleteListener(
      new OnCompleteListener<DocumentSnapshot>() {
        @Override public void onComplete(@NonNull Task<DocumentSnapshot> task) {
          long end = System.currentTimeMillis();
          Log.d("FirestoreStorage", "get() time: " + (end - start));
        }
      });
}

这是我在LogCat中看到的:

10-10 22:30:06.026 D/FirestoreStorage: get() time: 1666
10-10 22:30:08.199 D/FirestoreStorage: get() time: 264

第一次读取总是很慢,后续读取大约是200ms.该文档非常小,目前它只有4个属性,只有一个(int)非空,因此大小不是问题.在真实手机上运行应用程序,在Android 7.1上运行Nexus 6

问题:我做错了什么?我基本上使用的是“操作指南”中的“Getting data“样本.

像这样的读取应该花费0毫秒.如果没有解决方法,我想我必须放弃将Realtime存储作为应用程序的唯一存储的想法,并回到简单的SQLite并使用Firebase / Firestore作为单独的云存储.

更新从版本16.0.0 DocumentReference.get()Query.get()开始,有一个新参数“source”,它允许控制数据的读取位置 – 只有服务器,只有缓存或尝试服务器然后缓存.

PS Firestore存储初始化和相应的日志,抱歉不是500ms而是350,它不同,有时400,有时300:

  public FirestoreStorage(String userRef) {
    Log.i(TAG, "User ref: \"" + userRef + "\"");
    db = FirebaseFirestore.getInstance();
    Log.i(TAG, "Is persistence enabled: " + db.getFirestoreSettings().isPersistenceEnabled());
    DocumentReference userDoc = db.collection("users").document(userRef);
    prefsCollection = userDoc.collection("prefs");
    prefsCollection.addSnapshotListener(
        Executors.newFixedThreadPool(2),
        new EventListener<QuerySnapshot>() {
          @Override
          public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {
            Log.d(TAG, "Prefs.onEvent");
         }
    });
    Log.i(TAG, "Snapshot listener added");

    try {
      Thread.sleep(2000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }

日志:

10-11 23:11:42.382 I/FirestoreStorage: User ref: "<cut>"
10-11 23:11:42.474 I/FirestoreStorage: Is persistence enabled: true
10-11 23:11:42.496 I/FirestoreStorage: Snapshot listener added
10-11 23:11:42.855 D/FirestoreStorage: Prefs.onEvent

解决方法:

这些get()请求正在通过网络从Cloud Firestore后端读取数据,因此它们必然比只从磁盘本地读取的SQLite慢得多.第一次读取也可能比后续读取慢,因为它必须启动到后端的网络通道.我们将着眼于提高性能,但如果您通过网络检索数据,则不能指望0 ms.

您可能需要enable offline persistence,这将启用您之前读取的数据的本地缓存.请注意,get()调用仍将首先尝试访问网络,以便为您提供尽可能最新的数据.如果您使用addSnapshotListener(),我们将立即使用缓存数据呼叫您,而无需等待网络.

标签:android,firebase,google-cloud-firestore
来源: https://codeday.me/bug/20190622/1263965.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有