在 RxKotlin 中处理执行器
Handling Executors in RxKotlin
我将使用线程执行器与 rxkotlin 一起做一些后台工作,我将线程池大小固定为 3,但我的问题是在我的后台操作期间它只使用了 3 个中的一个线程,这减慢了我的后台操作
执行者class
class ThreadExe : Executor{
companion object {
private const val THREAD_POOL_SIZE = 3
}
private val executor: Executor =
Executors.newFixedThreadPool(THREAD_POOL_SIZE)
override fun execute(runnable: Runnable) {
executor.execute(runnable)
}
}
上面是我的执行者class负责创建线程
我将像下面这样调用我的后台任务
getSomeDataFromNetworkProcessWithDB()
.subscribeOn(Schedulers.from(ThreadExe()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe()
fun getSomeDataFromNetworkProcessWithDB() {
Observable.fromIteratable(someDataList())
.flatMap {
getSomeNetworkData()
}
.flatMap {
doSomeDbOperation()
}
}
我上面代码的问题是所有这些网络和数据库操作都在同一个线程中按顺序工作,因为我们给了大小为 3 的线程池,它必须并行发送 3 个网络请求,但请求是按顺序进行的
谁能帮我解决这个问题?
如果你想在不同的线程上单独操作 运行 试试这个:
getSomeDataFromNetworkProcessWithDB(Schedulers.from(ThreadExe()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe()
fun getSomeDataFromNetworkProcessWithDB(scheduler: Scheduler): Observable<Data> {
return Observable.fromIterable(someDataList())
.flatMap {
getSomeNetworkData().subscribeOn(scheduler)
}
.flatMap {
doSomeDbOperation().subscribeOn(scheduler)
}
.subscribeOn(scheduler) // optional, if you want fromIterable(), someDataList() to run on this scheduler.
}
我将使用线程执行器与 rxkotlin 一起做一些后台工作,我将线程池大小固定为 3,但我的问题是在我的后台操作期间它只使用了 3 个中的一个线程,这减慢了我的后台操作
执行者class
class ThreadExe : Executor{
companion object {
private const val THREAD_POOL_SIZE = 3
}
private val executor: Executor =
Executors.newFixedThreadPool(THREAD_POOL_SIZE)
override fun execute(runnable: Runnable) {
executor.execute(runnable)
}
}
上面是我的执行者class负责创建线程
我将像下面这样调用我的后台任务
getSomeDataFromNetworkProcessWithDB()
.subscribeOn(Schedulers.from(ThreadExe()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe()
fun getSomeDataFromNetworkProcessWithDB() {
Observable.fromIteratable(someDataList())
.flatMap {
getSomeNetworkData()
}
.flatMap {
doSomeDbOperation()
}
}
我上面代码的问题是所有这些网络和数据库操作都在同一个线程中按顺序工作,因为我们给了大小为 3 的线程池,它必须并行发送 3 个网络请求,但请求是按顺序进行的
谁能帮我解决这个问题?
如果你想在不同的线程上单独操作 运行 试试这个:
getSomeDataFromNetworkProcessWithDB(Schedulers.from(ThreadExe()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe()
fun getSomeDataFromNetworkProcessWithDB(scheduler: Scheduler): Observable<Data> {
return Observable.fromIterable(someDataList())
.flatMap {
getSomeNetworkData().subscribeOn(scheduler)
}
.flatMap {
doSomeDbOperation().subscribeOn(scheduler)
}
.subscribeOn(scheduler) // optional, if you want fromIterable(), someDataList() to run on this scheduler.
}