我是RxJava / 2的新手,使用Observable进行表单验证。
如何在活动销毁时处置我的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}$");
}
这个没有返回任何东西来保存引用并处理清理?
答案 0 :(得分:1)
正如@Blackbelt建议的那样,subscribe()
有一些重载版本(请参阅docs)。
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}$");
}
}
(虽然lambdas可以真正缩短,从而提高代码的可读性,但我选择不使用它们以便清楚地说明使用的类型)。