Я новичок в 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}$");
}
Этот не возвращает ничего для хранения ссылки и удаления при очистке?




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