簡體   English   中英

Firebase Firestore 同步檢索數據/無回調

[英]Firebase Firestore retrieve data Synchronously/without callbacks

我在我的 Android 應用程序的單獨線程中使用 Cloud Firestore,因此我不想使用偵聽OnSuccessListenerOnFailureListener在另一個線程中運行。 我可以讓我的線程等待結果(並在需要時捕獲任何異常)嗎?

目前查詢的代碼是這樣的:

FirebaseFirestore.getInstance().collection("someCollection").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
    @Override
    public void onSuccess(QuerySnapshot documentSnapshots) {
         // do something on the UI thread with the retrieved data
         }
    });

我想要的是:

FirebaseFirestore.getInstance().collection("someCollection").getAndWaitForResult();
//Block the thread and wait for result, no callbacks. 
//getAndWaitForResult() is not a real function, just something to describe my intention.

我以前用過 Parse Server,那是很瑣碎的事情。

您可以同步加載數據,因為DocumentReference.get()返回一個Task 所以你可以等待那個任務。

如果我這樣做:

    val task: Task<DocumentSnapshot> = docRef.get()

然后我可以等待它完成

val snap: DocumentSnapshot = Tasks.await(task)

當在get()之后將其他操作連接在一起時,這可能需要一段時間,這很有用:

val任務:Task = docRef.get()。continueWith(executor,continuation)

上面,我在一個單獨的執行器上運行一個延續,我可以等待所有這些完成Tasks.await(task)

請參閱https://developers.google.com/android/guides/tasks

注意:您不能在主線程上調用Tasks.await()。 Tasks API專門檢查此情況並將引發異常。

還有另一種使用事務同步運行的方法。 看到這個問題。

你可以在主線程上做這樣的事......

YourObject yourObject = (YourObject)new RunInBackground().
                          execute("someCollection","someDocument").get()

背景線程是......

public class RunInBackground extends AsyncTask {

  @Override
  protected Object doInBackground(Object[] objects) {

    Task<DocumentSnapshot> documentSnapshotTask = FirebaseFirestore.getInstance().
             collection((String) objects[0]).document((String) objects[1]).get();

    YourObject obj=null;

    try {
        DocumentSnapshot documentSnapshot = Tasks.await(documentSnapshotTask);

        obj = new YourObject();
        obj.setter(documentSnapshot.get("your field"));

    } catch (ExecutionException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    return obj;
  }
}

如果您使用的是 Kotlin,請添加分機號 function:

private suspend fun <TResult> Task<TResult>.await(): TResult? {
   return try {
       Tasks.await(this)
   } catch (e: Exception) {
       null
   }
}

現在你可以做

val snapshot = fireStore.collection(USER_ROOT_PATH).document(documentPath)?.get()?.await()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM