剛開始探索Firestore存儲並首先要做的事情 - 通過文檔密鑰(通過Google驗證,但可能不重要)在我的Android應用程序中讀取一個簡單的小文檔。這裏是一個片段:Firestore文檔get()性能
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毫秒。如果沒有解決方法,我想我不得不放棄實時存儲的想法該應用的唯一存儲和找回普通SQLite和使用火力地堡/公司的FireStore作爲一個單獨的雲存儲。
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
您如何期望網絡調用在0毫秒內返回數據? –
我沒有:)我沒有想到網絡會被捲入那裏,我認爲它只會返回它在本地緩存的版本。如果這就是我附加一個監聽器時得到的結果,爲什麼get()會有所不同?這很混亂。理想情況下,我更喜歡一個標誌來說明我是否想嘗試從服務器獲取實際數據,或者我只想快速獲得本地數據 – smok