, как предложил @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}$");
}
}
(хотя лямбды могут действительно сокращать и, следовательно, улучшать читабельность вашего кода, я решил не использовать их, чтобы наглядно проиллюстрировать используемые типы).