В RxJava Schedulers определяют, в каком потоке выполняются операции. Правильный выбор Scheduler критически важен для производительности и отзывчивости Android-приложений.
apiService.getData()
.subscribeOn(Schedulers.io())
.subscribe { /* обработка данных */ }
Observable.just("Hello")
.observeOn(AndroidSchedulers.mainThread())
.subscribe { textView.text = it }
Observable.just(1, 2, 3)
.subscribeOn(Schedulers.computation())
.map { it * it } // CPU-интенсивная операция
Scheduler | Пул потоков | Оптимизация | Использование в Android |
---|---|---|---|
io() | Неограниченный | I/O операции | Сетевые запросы, работа с БД |
computation() | Фиксированный (ядра) | CPU задачи | Вычисления, обработка данных |
mainThread() | Главный поток | UI обновления | Обновление View |
newThread() | Новый поток | Изолированные задачи | Редко используется |
single() | Один поток | Последовательные операции | Логирование, последовательные запросы |
trampoline() | Текущий поток | Тестирование | Юнит-тесты |
Основное правило:
subscribeOn()
- где выполняется работа (обычно io/computation)observeOn()
- где обрабатывается результат (обычно mainThread)Типичный паттерн:
api.getData()
.subscribeOn(Schedulers.io()) // Запуск в I/O потоке
.observeOn(AndroidSchedulers.mainThread()) // Обработка в UI потоке
.subscribe { showData(it) }
Опасные комбинации:
subscribeOn(io())
observeOn(mainThread())
Оптимизации:
subscribeOn()
observeOn()
для разных этапов обработкиval dbScheduler = Schedulers.from(Executors.newFixedThreadPool(4))
databaseOperations
.subscribeOn(dbScheduler)
val testScheduler = TestScheduler()
Observable.timer(1, TimeUnit.SECONDS, testScheduler)
.subscribe { /* проверка */ }
testScheduler.advanceTimeBy(1, TimeUnit.SECONDS)
Утечки памяти:
Перегрузка computation():
Избыточные observeOn():
выбор правильного Scheduler в RxJava напрямую влияет на производительность приложения. Для Android-разработки наиболее критичны io()
, computation()
и mainThread()
. Всегда четко определяйте, где выполняется работа и где обрабатывается результат, избегайте работы с UI не в главном потоке.