本题目摘自一篇 Blog,大家先尝试思考下,过两天注明博客链接。
众所周知,对于 RxJava我们可以使用:
- observeOn
- subscribeOn
去做线程调度,我们看个例子:
fun fetchItem(): Single<Item> {
return download(itemId.getAndIncrement())
.flatMap(::unZip)
.flatMap(::checkMd5)
}
private fun download(id: Int): Single<Item> {
return Single.just(id)
//Simulate a long time operation
.delay(300, TimeUnit.MILLISECONDS, Schedulers.io())
.map { Item(it) }
}
private fun unZip(item: Item): Single<Item> {
return Single.just(item)
//Simulate a long time operation
.delay(300, TimeUnit.MILLISECONDS, Schedulers.io())
}
private fun checkMd5(item: Item): Single<Item> {
return Single.just(item)
//Simulate a long time operation
.delay(300, TimeUnit.MILLISECONDS, Schedulers.io())
}
上面模拟的操作中,download unZip checkMd5 都各自指定了调度器,导致 fetchItem 实际上发生了三次线程切换。
对于这种一系列的耗时操作来说,完全可以运行在同一条后台线程上。
还有这个更刻意的例子:
Observable
.create(emitter -> {
System.out.println("create on " + Thread.currentThread().getName());
emitter.onNext("Test");
emitter.onComplete();
})
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.map(s -> {
System.out.println("map on " + Thread.currentThread().getName());
return s;
})
.observeOn(Schedulers.io())
.flatMapCompletable(s -> {
System.out.println("flatMap on " + Thread.currentThread().getName());
return Completable.complete();
})
.subscribe();
其实几次操作都交给了 io 线程调度,大概率运行在不同的线程上,实际上完全可以避免没有必要的 io 调度。
问题来了:
- 我们如何无感知的避免这类多余的线程调度,例如当前方法已经运行在 io 线程,那么就没有必要再去做 io 线程调度了;
- 无感知指的是,不需要刻意去修改业务逻辑代码,毕竟上面第一个例子那个几个方法内部指定Schedulers.io()也是合理的。
更多问答 >>
-
每日一问 | 类要先加载、链接、初始化才能实例化,有特殊Case吗?
2021-02-21 20:15 -
每日一问 | 今天还探索一个 View 的方法 hasOverlappingRendering()
2021-02-21 20:16 -
每日一问 | Android 中两种设置线程优先级的方式,有何区别?
2021-01-27 23:59 -
每日一问 | Java 中的 lambda 与 Android 中的 lambda 有什么不同?
2021-01-31 17:20 -
每日一问 | Java中匿名内部类写成 lambda,真的只是语法糖吗?
2021-01-11 00:00 -
每日一问 | RxJava中Observable、Flowable、Single、Maybe 有何区别?
2021-01-03 20:34 -
每日一问 | View invalidate() 相关的一些细节探究~
2020-12-27 22:38
减少RxJava中多余的线程调度
😁牛皮的搜索能力,点赞
刚学完RxJavaPlugins,代码没有验证过,感觉应该差不多就是这么干