RxJava 2 Disposable при уничтожении активности

Я новичок в RxJava / 2, выполняю проверку формы с помощью Observable.

Как я могу избавиться от наблюдаемого объекта, когда активность разрушается?

Мой КОД:

     private Observable<CharSequence> passwordChangeObservable = 
RxTextView.textChanges(passwordTxt);

    passwordChangeObservable
                    .debounce(400, TimeUnit.MILLISECONDS)
                    .map(this::isValidPassword)
    //                .distinctUntilChanged()
                    .subscribeOn(Schedulers.io()) // Or Schedulers.newThread()
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<Boolean>() {

                        @Override
                        public void onSubscribe(Disposable d) {

                        }

                        @Override
                        public void onNext(Boolean aBoolean) {

                        }

                        @Override
                        public void onError(Throwable e) {

                        }

                        @Override
                        public void onComplete() {

                        }
                    });

 private Boolean isValidPassword(CharSequence value) {
        return value.toString().matches("^(?=.*\\d).{4,8}$");
    } 

Этот не возвращает ничего для хранения ссылки и удаления при очистке?

есть перегруженные версии подписки, которые возвращают объект Disposable

Blackbelt 10.06.2018 12:32
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
1 268
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

как предложил @Blackbelt, существует несколько перегруженных версий subscribe() (см. документы).

  • несколько, которые принимают комбинации Consumer и Action
  • тот, который берет Observer

первые возвращают экземпляр Disposable, посредством чего подписка может быть прекращена; последний - нет. поэтому, если вы хотите избавиться от своего потока в onDestroy(), вам следует изменить версию subscribe(), которую вы используете.

структурно это выглядело бы примерно так:

public class Blah extends AppCompatActivity {

    private EditText passwordTxt;

    private Disposable disposable;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        disposable = RxTextView.textChanges(passwordTxt)
                .debounce(400, TimeUnit.MILLISECONDS)
                .map(this::isValidPassword)
                .subscribeOn(Schedulers.io()) // Or Schedulers.newThread()
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                        new Consumer<Boolean>() {
                            @Override
                            public void accept(Boolean aBoolean) throws Exception {
                                // onNext
                            }
                        },
                        new Consumer<Throwable>() {
                            @Override
                            public void accept(Throwable throwable) throws Exception {
                                // onError
                            }
                        },
                        new Action() {
                            @Override
                            public void run() throws Exception {
                                // onComplete
                            }
                        },
                        new Consumer<Disposable>() {
                            @Override
                            public void accept(Disposable disposable) throws Exception {
                                // onSubscribe
                            }
                        }
                );
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        if (disposable != null && !disposable.isDisposed()) {
            disposable.dispose();
        }
    }

    private Boolean isValidPassword(CharSequence value) {
        return value.toString().matches("^(?=.*\\d).{4,8}$");
    }

}

(хотя лямбды действительно могут сократить и, таким образом, улучшить читаемость вашего кода, я решил не использовать их, чтобы четко проиллюстрировать используемые типы).

Другие вопросы по теме