如何在RxBinding中出现错误后重新绑定View?

时间:2015-11-25 05:29:52

标签: android rx-java

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将不再打印日志。

我想知道如何在发生错误后重新绑定此视图。

1 个答案:

答案 0 :(得分:2)

我认为最好的方法是在这种情况下完全不依赖onError

我相信我在某处看到,Rx中的onError仅用于无法预料的错误,而不是用于正常的控制流 - 非常类似于例外。

因此,根据您i点击0的情况,您希望发生什么:

另一个注意事项:我不确定RxJava社区推动这个视图有多少,但在其他一些FRP实现(例如Sodium)中,传递给map的函数应该非常,一世。即除了他们的投入之外,他们不应该影响或受到任何影响。