RxJava
是一件很棒的事情,因为它可以帮助我处理异步任务。
但是,当我使用RxBinding
将View与其单击事件绑定时,我发现如果发生错误并且不再调用绑定事件。
为了解释我的问题,我在一个简单的Activity中简化了我的代码。
public class Test extends RxAppCompatActivity {
int i = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button = new Button(this);
button.setText("Click");
setContentView(button);
RxView.clickEvents(button)
.compose(this.<ViewClickEvent>bindToLifecycle())
.map(new Func1<ViewClickEvent, Integer>() {
@Override
public Integer call(ViewClickEvent viewClickEvent) {
--i;
return 5 / i;
}
})
.subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
Log.d("Test", "Completed");
}
@Override
public void onError(Throwable e) {
Log.d("Test", "Error");
}
@Override
public void onNext(Integer integer) {
Log.d("Test", "Result :" + integer);
}
});
}
}
您可以看到,如果我单击此按钮超过3次,则logcat将不再打印日志。
我想知道如何在发生错误后重新绑定此视图。
答案 0 :(得分:2)
我认为最好的方法是在这种情况下完全不依赖onError
。
我相信我在某处看到,Rx中的onError
仅用于无法预料的错误,而不是用于正常的控制流 - 非常类似于例外。
因此,根据您i
点击0
的情况,您希望发生什么:
只需在onErrorResumeNext()
之后添加一些map
并吞下错误(并可能将其替换为其他值)。
将Integer
结果包装在其他类中,该类还有另一个值来指示失败(例如来自https://functionaljava.googlecode.com/svn/artifacts/3.0/javadoc/fj/data/Either.html的Either
类或者其他一些手 - 写的)。
另一个注意事项:我不确定RxJava社区推动这个视图有多少,但在其他一些FRP实现(例如Sodium)中,传递给map
的函数应该非常纯,一世。即除了他们的投入之外,他们不应该影响或受到任何影响。