Android 等待已订阅的可观察项
我通过订阅呼叫服务器,并使用结果更新Android 等待已订阅的可观察项,android,rx-java,Android,Rx Java,我通过订阅呼叫服务器,并使用结果更新Activity1视图: //from within Activity1 xxx = fetch.byId(id) .subscribe(new Subscriber<Model>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) {
Activity1
视图:
//from within Activity1
xxx = fetch.byId(id)
.subscribe(new Subscriber<Model>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Model model) {
//update view with the model
}
});
//从Activity1中
xxx=fetch.byId(id)
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
}
@凌驾
公共无效申报人(可丢弃的e){
}
@凌驾
public void onNext(模型){
//使用模型更新视图
}
});
所有这些都应该在用户不可见的情况下发生(没有进度对话框等)
我更想要的是处理点击活动1
:点击时,我必须等待xxx
接收模型
,然后启动活动2
(需要显示模型
值)。如果单击发生在xxx
完成之后,那么我不必等待(因为它已经完成)并立即启动活动2
我怎样才能优雅地等待已经订阅的可观察对象呢?您可以通过使用操作符来实现这一点。只有当所有压缩的可观察物发出时,它才会发出一个项目,即加载数据并单击按钮
fetch.byId(id)
.zipWith(RxView.clicks(button)
.doOnNext(click -> showLoading()), // when user clicks the button, show your progress dialog
(model, click) -> model // when both model is loaded and button is clicked, pass only the model forward
)
.subscribe(new Subscriber<Model>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Model model) {
//update view with the model
startActivity2()
}
});
fetch.byId(id)
.zipWith(RxView.clicks)(按钮)
.doOnNext(单击->showLoading()),//当用户单击按钮时,显示进度对话框
(模型,单击)->model//加载两个模型并单击按钮时,仅向前传递模型
)
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
}
@凌驾
公共无效申报人(可丢弃的e){
}
@凌驾
public void onNext(模型){
//使用模型更新视图
startActivity2()
}
});
您可以通过使用操作员来执行此操作。只有当所有压缩的可观察物发出时,它才会发出一个项目,即加载数据并单击按钮
fetch.byId(id)
.zipWith(RxView.clicks(button)
.doOnNext(click -> showLoading()), // when user clicks the button, show your progress dialog
(model, click) -> model // when both model is loaded and button is clicked, pass only the model forward
)
.subscribe(new Subscriber<Model>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Model model) {
//update view with the model
startActivity2()
}
});
fetch.byId(id)
.zipWith(RxView.clicks)(按钮)
.doOnNext(单击->showLoading()),//当用户单击按钮时,显示进度对话框
(模型,单击)->model//加载两个模型并单击按钮时,仅向前传递模型
)
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
}
@凌驾
公共无效申报人(可丢弃的e){
}
@凌驾
public void onNext(模型){
//使用模型更新视图
startActivity2()
}
});
不是最好的解决方案,而是最简单的解决方案
不是最好的解决方案,但最简单的方法是使用
如果单击发生在xxx完成之后,那么我不必等待(因为它已经完成)并立即启动活动2
。在这一部分我仍然不知道:如果xxx
完成,你已经进入Activity2
=>没有办法点击Activity1
?一切都发生在Activity1中,Activity2对这个问题没有意义,只是一个行动的例子。如果点击发生在xxx完成之后,那么我不必等待(因为已经完成了)现在就开始活动2。这一部分我还不知道:如果xxx
完成,你已经去了Activity2
=>没有办法点击Activity1
?Activity1中发生的一切,Activity2对这个问题没有意义,只是一个行动的例子。实际上,这应该是可行的,但这是c即使没有主题也可以实现。实际上,这应该可以实现,但即使没有主题也可以实现。我更喜欢combinelatetest
,而不是zip
,因为它可以多次单击。如果您需要它只工作一次,则执行获取.byId(id).combinelatetest(RxView.clicks(button)…更有效。点击(1) .subscribe(…)
,因为zip会在抓取过程中缓冲所有的点击。我更喜欢CombineTest
,而不是zip
,因为它可以进行多次点击。如果您需要它只工作一次,那么执行fetch.byId(id)。CombineTest(RxView.clicks(button)…)。获取(1)。订阅(…)
as zip将在抓取期间缓冲所有点击。
xxx.toCompletable()
.doOnSubscribe(this::showProgress)
.subscribe(this::goToActivity2, this::displayError);