android - 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?你会如何解决这个问题?
解决方案
您可以使用@MarkKeen 在评论中建议的答案,但如果您想坚持使用 RxJava,您可以随时调用该方法.blockingGet()
以阻塞,直到发出值为止。
推荐阅读
- css - 如何放置从 `.col-md-4` 到屏幕末尾的图像?
- android - 如何在 android Jelly Bean 中使用滚动视图处理多个图像
- javascript - 如果今天日期是我的自定义日期,则显示 div
- sql-server - 接受特定字符的电话号码
- angularjs - 重定向路由html5Mode不起作用
- angular - Angular 7 pipe(tap()) 第二次不起作用
- python-3.x - 是否可以将大型 oracle 数据库(600+ GB)导入 jupyter 笔记本?
- php - 空会话变量
- java - 如何访问与不同类的方法本地内部类同名的类
- azure - 如何在 Visual Studio 2017 上正确运行 Azure 函数?