在RxKotlin中处理执行程序

时间:2019-06-03 09:35:59

标签: android rx-java2 rx-kotlin2

我将使用线程执行程序对rxkotlin进行一些后台工作,将线程池大小固定为3,但是我的问题是在后台操作期间,它仅使用3个线程中的一个,这减慢了我的后台操作

执行人班

 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)
    }

}

上面是我的执行者类,负责创建线程。
我将像下面这样称呼我的后台任务

 getSomeDataFromNetworkProcessWithDB()
    .subscribeOn(Schedulers.from(ThreadExe()))
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe()

fun getSomeDataFromNetworkProcessWithDB() {
    Observable.fromIteratable(someDataList())
            .flatMap {
                getSomeNetworkData()
            }
            .flatMap {
                doSomeDbOperation()
            }
}

我上面的代码的问题是所有这些网络和db操作都在同一个线程上按顺序工作,因为我们给了大小为3的线程池,它必须并行发送3个网络请求,但请求按顺序进行
谁能帮我解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果您希望单个操作在不同的线程上运行,请尝试以下操作:

    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.
}