В сегодняшней заметке хочу рассказать о практике реактивного программирования для Android с использование kotlin.
Дано: есть компонент кастомный (конкретно
https://github.com/MiguelCatalan/MaterialSearchView)
Задача: запрашивать данные с сервера, используя MaterialSearchView используя RxJava 😉
Немного поразмыслив получаем задачу в таком виде: обернуть стандартный слушатель MaterialSearchView… ну использовав возможности Kotlin extentions.
Код (обёртка):
public fun MaterialSearchView.asObserver(): Observable{
return Observable.create { subscriber ->
var watcher= object: MaterialSearchView.OnQueryTextListener{
override fun onQueryTextSubmit(query: String?): Boolean {
if (!subscriber.isUnsubscribed) {
subscriber.onNext(query)
return true
}
return false
}
override fun onQueryTextChange(newText: String?): Boolean {
if (!subscriber.isUnsubscribed) {
subscriber.onNext(newText)
return true}
return false}
}
this.setOnQueryTextListener(watcher)
}}
В итоге, для запросов получается примерно такой код:
fun searchHandler(){
searchView.asObserver()
.debounce(500, TimeUnit.MILLISECONDS)
.subscribe {Запрос_на_сервер(it.toString)}
}
(в коде задержка в 500 мл сек, чтобы не мучить сервер зря)
Вот в принципе и все.
Маленький вывод: реактивность рулит) С kotlin все очень хорошо вяжется и нет проблем.
Ошибки, соображения и предложения оставляйте в комментариях.
Подробнее как обернуть слушатель тут:
https://github.com/JakeWharton/RxBinding