首页 > 解决方案 > Firebase Firestore 的 RxJava2 包装器,无需切换线程?

问题描述

我正在尝试为 Firebase Firestore 调用创建一个反应性的 observable。我正面临线程问题。我正在使用 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?你会如何解决这个问题?

标签: androidfirebasegoogle-cloud-firestorerx-java2

解决方案


您可以使用@MarkKeen 在评论中建议的答案,但如果您想坚持使用 RxJava,您可以随时调用该方法.blockingGet()以阻塞,直到发出值为止。


推荐阅读