Обработка исполнителей в RxKotlin

Я буду использовать исполнители потоков для выполнения некоторой фоновой работы с 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()
            }
}

моя проблема с приведенным выше кодом заключается в том, что все эти операции сети и базы данных работают последовательно с одним и тем же потоком, поскольку у нас есть пул потоков размера 3, он должен отправлять 3 сетевых запроса параллельно, но запрос идет последовательно
Может ли кто-нибудь помогите мне решить эту проблему?


person Stack    schedule 03.06.2019    source источник


Ответы (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.
}
person Sanlok Lee    schedule 03.06.2019