Оболочка RxJava2 для Firebase Firestore без переключения потоков? - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь создать реактивную наблюдаемую для вызовов Firebase Firestore.Я столкнулся с проблемой многопоточности.Я использую rxjava2 для обработки потоков, и я не хочу, чтобы Firestore API делал это для меня.Кажется, что вызовы Firestore являются асинхронными, поэтому OnSuccess метод вызывается в основном потоке

Вот простой пример, демонстрирующий проблему:

Single<Integer> firestoreSingle = Single.create(emitter -> {
   Log.d("TAG", Thread.currentThread().getName()); // -> RxCachedThreadScheduler-3 Thread
   CollectionReference collectionRef = FirebaseFirestore.getInstance().collection("test_collection");
   collectionRef.get().addOnSuccessListener(queryDocumentSnapshots -> {
       Log.d("TAG",Thread.currentThread().getName()); // -> MAIN THREAD
       List<DocumentSnapshot> documentSnapshotList = queryDocumentSnapshots.getDocuments();
       emitter.onSuccess(documentSnapshotList.size());
   }).addOnFailureListener(emitter::onError);
});

firestoreSingle
.subscribeOn(Schedulers.io())
.subscribe(howManyDocs -> {
    Log.d("TAG",Thread.currentThread().getName()); // -> MAIN THREAD
    Log.d("TAG","How many docs: " + howManyDocs);
});

Конечно, я мог быдобавьте .observeOn(Schedulers.io()) к реактивному потоку, но тогда я не обязательно получу результаты в том же потоке, на который я изначально подписан.

Мне не нужны результаты ни в основном потоке, ни в другом потоке, на который я подписан.

Есть ли способ сделать запрос Firestore синхронно? Как бы вы решили эту проблему?

1 Ответ

0 голосов
/ 24 июня 2019

Вы можете использовать ответ, который @MarkKeen предложил в комментарии, но для справки, если вы хотите придерживаться RxJava, вы всегда можете вызвать метод .blockingGet(), чтобы, как он предлагает, заблокировать, пока не будет получено значение.

...