Начал постепенно переходить на реактивное программирование с замечательным фреймворком RxJava 2 и заинтересовал простейший пример создания потока в динамическом стиле. К сожалению, не считаю пример Observable.just(1,2,3) достаточно полным для себя, но вот уже несколько часов мучаю себя мыслью, как превратить изменения в EditText в поток данных? Если не сложно, опишите, пожалуйста, пример как сделать реальный Observable из TextWatcher, чтобы можно было на него подписаться и подписчик реагировал на изменения текста в EditText.
Ответ
Можно воспользоваться готовой библиотекой RxBinding. Также в ней можно посмотреть конкретную реализацию
Вообще для связки callback-методов с rx используется метод Observable.create, например:
Observable.create(emitter -> {
TextWatcher watcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
if (!emitter.isDisposed()) { //если еще не отписались
emitter.onNext(editable.toString()); //отправляем текущее состояние
}
}
};
emitter.setCancellable(() -> editText.removeTextChangedListener(watcher)); //удаляем листенер при отписке от observable
editText.addTextChangedListener(watcher);
});
Нужно не забыть подписаться, и самое главное, отписаться от такого источника данных, т.к. он держит ссылку на editText и может привести к утечке памяти.
Комментариев нет:
Отправить комментарий