2017-10-23 51 views
2

私はAndroidアプリケーションの別スレッドでCloud Firestoreを使用していますので、別のスレッドでリスナーOnSuccessListenerOnFailureListenerを使用したくありません。スレッドが結果を待つようにすることはできますか(必要に応じて例外をキャッチします)?Firebase Firestoreでデータを取得するコールバックを同期的に/非同期で

現在のクエリのコードは、このようなものです:私はしたいのですがどのような

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. 

は私が前に解析サーバーで動作するように使用され、それは非常に些細でしたそこ。

+0

あなたが正しく理解していれば、あなたは 'onStop'または' onPause'で始まるリクエストをキャンセルする必要があります。 – Ibrahim

+0

本当にありません。私は説明するためにいくつかのコードを追加しました。 –

+0

'EventListener'を使用してカスタムクラスで実装し、' onEvent() 'で必要なものをトリガーします – amrro

答えて

1

DocumentReference.get()Taskを返すため、データを同期的に読み込むことができます。 その作業を待つだけです。

私が行う場合のような何か:それは実行して完了させるために私は待つことができ、その後

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

val snap: DocumentSnapshot = Tasks.await(task) 

継続と)一緒に取得(後に他の操作をpiplining場合に便利です少し時間がかかります:

valタスク:タスク= docRef.get()。continueWith(実行者、継続)

以上、別のエグゼキュータで継続を行っています。Tasks.await(task)で完了するまで待つことができます。

https://developers.google.com/android/guides/tasks

注を参照してください:あなたは、あなたのメインスレッド上Tasks.await()を呼び出すことはできません。タスクAPIは、この条件を特にチェックし、例外をスローします。

トランザクションを使用して同期して実行する別の方法があります。 を参照してくださいthis question.

+0

私はそれを逃した、ありがとう。 私の答えはもはや関連していないので、私はそれを削除しました。 – amrro

関連する問題