rxjava - 结合onerror和超时处理

时间:2014-11-19 09:17:22

标签: asynchronous rx-java

我将从我想要实现的目标开始。

  • 我想调用一个返回Observabe的方法。
  • 我不知道被调用的方法是否处理异常和超时
  • 我想在我的通话中合并observable(合并/ zip等)
  • 如果一个方法失败,我想要成功的方法的答案 - 我不想打破这种流动。

如果例外,我有能力处理它并继续流动, 但是当我尝试添加超时管理时,我失败了。

这是我的代码

public static void main(String[] args) {
    createObservables(false, true); // stalls for timeout
    zip();
}
private static void createObservables(final boolean throwException, 
                                      final boolean stall) {

   obs1 = Observable.just(1);

   obs1 = obs1.map(new Func1<Integer, Integer>() {
        @Override public Integer call(Integer integer) {
            int i = 0;
            if (throwException)
                getObj().equals("");
            if (stall)
                zzz(10);
            return ++integer;
        }

   });
   obs2 = Observable.just(111);
}

private static void zip() {
    System.out.println("**Zip**");

    obs1 = obs1.onErrorReturn(new Func1<Throwable, Integer>() {
        @Override public Integer call(Throwable throwable) {
            return 999;
        }
    });

    obs1 = obs1.timeout(5, TimeUnit.SECONDS);

    Observable.zip(obs1, obs2, new Func2<Integer, Integer, ArrayList<Integer>>() {
        @Override
        public ArrayList<Integer> call(Integer integer1, Integer integer2) {
            ArrayList<Integer> integers = new ArrayList<Integer>();
            integers.add(integer1);
            integers.add(integer2);
            return integers;
        }
    }).subscribe(new Observer<Object>() {....}
    );
}

现在,当我打电话

createObservables(false , false);  // no exceptions and timeouts 

我接下来 - [2,111] 然后我打电话给

createObservables(true, false);  // throw exception in one method only 

我接下来 - [999,111] - 这就是我想要的。异常和第二种方法的结果。 但是当我打电话时

createObservables(false, true); // stall on timeout 

我只得到onError 但我想得到另一种方法的答案 感谢。

1 个答案:

答案 0 :(得分:0)

尝试为超时值创建一个observable,在这种情况下,您需要与错误案例相同的值:

Observable obs1Timeout = Observable.just(999);

然后在你的超时策略中给它这个observable作为在超时情况下使用的回退:

obs1 = obs1.timeout(5, TimeUnit.SECONDS, obs1Timeout);