ReactiveSDK — это легковесное решение для авторов android приложений и библиотек, которое предоставляет функциональные реактивные программные интерфейсы (FRP) для работы с асинхронными потоками данных. Библиотека включает в себя основные классы для работы с реактивными потоками, такие как Single
, Observable
и Subjects
.
- В вашем
<project>/settings.gradle.kts
добавьте репозиторий:
pluginManagement {
repositories {
// здесь другие репозитории c вашими зависимостями
maven { setUrl("https://artifactory-external.vkpartner.ru/artifactory/rustore-maven/") }
}
}
- В вашем
<project>/<app_module>/build.gradle.kts
добавьте зависимость:
dependencies {
implementation("ru.rustore:reactive:0.0.1")
}
Класс Single
представляет собой реактивный поток, который может завершиться либо успешно, вернув один элемент, либо с ошибкой.
Пример использования:
Single.from { "Hello, World!" }
.subscribe(
onSuccess = { println(it) },
onError = { it.printStackTrace() }
)
Класс Observable
представляет собой реактивный поток, который может эмитировать ноль, один или несколько элементов, а также завершиться успешно или с ошибкой.
Пример использования:
Observable.create { emitter ->
emitter.onNext("Hello")
emitter.onNext("World")
emitter.onComplete()
}
.subscribe(
onNext = { println(it) },
onComplete = { println("Completed") },
onError = { it.printStackTrace() }
)
Subject — это горячий тип потока. Это позволяет им одновременно получать данные и распространять их другим подписчикам.
Подписка на горячие источники не может завершиться onError
или onComplete
, у подписчиков будет вызываться только onNext
.
MutableSubject
— это изменяемый Subject, который может эмитировать данные и имеет возможность добавлять новых подписчиков.
Пример использования:
val subject: MutableSubject<String> = MutableSubject()
subject.observe().subscribe(
onNext = { println(it) },
onComplete = { println("Completed") },
onError = { it.printStackTrace() }
)
subject.emit("Hello")
subject.emit("World")
MutableStateSubject
- сохраняет в поле value последнее состояние, поведение очень похоже на StateFlow
из библиотеки kotlin coroutines.
В библиотеке есть методы преобразования горячих источников в их неизменяемые варианты (ReadOnlySubject
, ReadOnlyStateSubject
)
public fun <T> MutableSubject<T>.asSubject(): Subject<T> =
ReadOnlySubject(this)
public fun <T> MutableStateSubject<T>.asSubject(): Subject<T> =
ReadOnlySubject(this)
public fun <T> MutableStateSubject<T>.asStateSubject(): StateSubject<T> =
ReadOnlyStateSubject(this)
Single
и Observable
поддерживают управление потоками с помощью методов subscribeOn
и observeOn
.
Пример использования:
Observable.create { emitter ->
emitter.onNext("Hello")
emitter.onNext("World")
emitter.onComplete()
}
.subscribeOn(Dispatchers.io) // Все операторы ВЫШЕ будут выполняться на этом потоке
.observeOn(Dispatchers.main) // Все операторы НИЖЕ будут выполняться на этом потоке
.subscribe(
onNext = { println(it) },
onComplete = { println("Completed") },
onError = { it.printStackTrace() }
)
Для Unit тестирование реализован отдельный артефакт reactive-test
В вашем <project>/<app_module>/build.gradle.kts
добавьте зависимость:
dependencies {
testImplementation("ru.rustore:reactive-test:0.0.1")
}
При тестировании иногопоточного кода следует использовать тестовый диспатчер для запуска тела Unit-теста.
@Test
fun myTest() = runReactiveTest { testDispatcher ->
////
}
testDispatcher
имеет метод advanceTime
, который позволяет смещать время вперед для более удобного тестирования цепочек, в которых присутствуют вызовы delay()
Для тестирования цепочек присутствуют классы TestObservableObserver
, TestSingleObserver
, которые имеют механизмы проверок вызова соответствующих колбэков и получения результата цепочек.