Прежде всего, вы думаете правильно, создание Observable
для каждого события изменения далеко не эффективно.
Существует два подхода к этому:
Один
Вы можете использовать RxBinding , чтобы получить изменение текста Observable
, теперь вы можете flatMap
изменить текст вашего вызова apiService, вплоть до одного доступного.
disposable = RxTextView.textChanges(editText)
.switchMap { ApiService().checkUsername(it) }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { updateUi(it) }
Два
Вы можете использовать Subject
, чтобы использовать в качестве канала для изменений EditText
, например:
val editTextChangesSubject: PublishSubject<String> = PublishSubject.create()
// when the editText changes call
editTextChangesSubject.onNext(newText)
disposable = editTextChangesSubject
.switchMap { ApiService().checkUsername(it) }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { updateUi(it) }
Теперь это также одноразовое использование!
Примечание: Люди иногда склонны использовать технику Subject
, если они используют определенный шаблон архитектуры, который отделяет логику просмотра от логики среднего человека, если выне ограничиваясь этим, RxBinding
- это путь.
Также, если стоит упомянуть, два подхода дадут вам полномочия, которых не было при подписке на каждое событие изменения текста, как, например, использование операторов управления потоком.как debounce
или onBackpressureLatest
.
Редактировать :
Используется switchMap
вместо flatMap
, см. Разницу в Здесь