我正在尝试为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?您将如何解决此问题?
答案 0 :(得分:0)
您可以使用@MarkKeen在注释中建议的答案,但是如果您想坚持使用RxJava,则可以作为参考,可以始终调用方法.blockingGet()
来阻止它,直到发出值为止。