Страницы

Поиск по вопросам

понедельник, 2 марта 2020 г.

Как превратить EditText в поток данных для RxJava2?

#android #rxjava #listener #rxandroid #rxjava2


Начал постепенно переходить на реактивное программирование с замечательным фреймворком
RxJava 2 и заинтересовал простейший пример создания потока в динамическом стиле. К
сожалению, не считаю пример Observable.just(1,2,3) достаточно полным для себя, но вот
уже несколько часов мучаю себя мыслью, как превратить изменения в EditText в поток
данных? Если не сложно, опишите, пожалуйста, пример как сделать реальный Observable
из TextWatcher, чтобы можно было на него подписаться и подписчик реагировал на изменения
текста в EditText. 
    


Ответы

Ответ 1



Можно воспользоваться готовой библиотекой 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 и может привести к утечке памяти.

Комментариев нет:

Отправить комментарий