RxJava
是一个很棒的东西,因为它帮助我处理异步任务。
但是当我使用 RxBinding
将 View 与他们的点击事件绑定(bind)时,我发现如果发生错误并且绑定(bind)事件将不再被调用。
为了解释我的问题,我在一个简单的 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 将不再打印日志。
我想知道发生错误后如何重新绑定(bind)此 View 。
最佳答案
我认为最好的方法是在这种情况下完全不依赖 onError
。
我相信我在某处读到 Rx 中的 onError
旨在仅用于不可预见的错误,而不是用于正常的控制流——很像异常。
因此,根据您希望在 i
命中 0
的情况下发生什么,您可以:
只需在
<map
之后放置一些onErrorResumeNext()
并吞下错误(并可能将其替换为其他值)。将
Integer
结果包装在其他一些类中,该类也有另一个值来指示失败(例如来自 https://functionaljava.googlecode.com/svn/artifacts/3.0/javadoc/fj/data/Either.html 的Either
类或也许是其他一些手写类)。
另一个注意事项:我不确定 RxJava 社区在多大程度上插入了这种观点,但在其他一些 FRP 实现(例如 Sodium)中,传递给 map
的函数应该非常纯粹,我。 e.他们不应影响或受其输入以外的任何事物的影响。
关于android - RxBinding出错后如何重新绑定(bind)View?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33909081/