java - RxJava 2 Disposable 活动销毁
问题描述
我是 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}$");
}
这个没有返回任何东西来保存参考并在清理时处理?
解决方案
正如@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}$");
}
}
(虽然 lambdas 确实可以缩短,从而提高代码的可读性,但我选择不使用它们,以便清楚地说明使用的类型)。
推荐阅读
- html - 如何使用 JXBrowser 作为后台进程将 svg 数据从 HTML 页面动态写入文件
- java - 如何在 MainActivity.java 中循环 VideoView 元素?
- javascript - 如何在模态中显示pdf而不是在react js中的新窗口中打开它
- apache-spark - 用于环回存储的用户级库(HPC 中的 Spark 应用程序没有环回设备)
- nightwatch.js - 运行 .navigateTo() 协议操作时出错:超时
- java - Android web socket出现认证问题
- java - java对象头中hashcode的作用是什么
- neo4j - py2neo.packages.httpstream.http.SocketError:连接被拒绝
- javascript - 不使用本地 Dynamo DB 时,端点 URL 应该是什么?
- node.js - 如何使用 Discord Bot 发送问候消息 - NodeJS