0

我今天看到一些让我畏缩的代码,但我不知道如何修复它。

本质上,该代码.zip用于多个调用以将它们半链接在一起,然后对结果采取行动:

Observable.zip(service.getObservable1(), service.getObservable2(), service.getObservable3(), new Func3<Type1, Type2, Type3>(){
     public Object call(Type1 type1, Type2 type2, Type3 type3){
          // set a bunch of globals
          mGlobalState.setType1(type1);
          mGlobalState.setType2(type2);
          mGlobalSession.setType3(type3);
          return null;
     }
}).subscribe(mObserver);

很多事情看起来都是错的;在 .zip 调用中设置全局状态,返回 null,并且实际上并未将 .zip 用于其预期目的。此外,观察者onNext不使用结果,而是取决于在 .zip 中设置全局状态的副作用。

动机是所有这些 observables 只发出一次(它们是 API 调用),我们希望在缓存返回的值之前等待它们全部完成,然后进入应用程序中的下一个逻辑屏幕。

我不确定如何处理这个电话。我们不能在我们的 Java 版本上使用 lambda,而且我还没有找到一个不长五倍的干净解决方案。

4

2 回答 2

1

我相信一个优雅的解决方案是创建一个对象来对所有接收到的数据进行分组,然后作为zip函数的结果发出。

@Test
public void testSample() {
    Observable<String> a = Observable.just("a");
    Observable<Integer> b = Observable.just(1);
    Observable<Boolean> c = Observable.just(true);

    Observable.zip(a, b, c, Result::new).subscribe(result -> {
        // save data into your globals
    });
}

public class Result {
    private final String a;
    private final int b;
    private final boolean c;

    public Result(String a, int b, boolean c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public String getA() {
        return a;
    }

    public int getB() {
        return b;
    }

    public boolean isC() {
        return c;
    }
}
于 2016-07-03T02:13:54.207 回答
0

许多 Android 开发人员使用 Retrolambda 在构建时执行 lambdas 的反向移植,并在保持兼容性的同时拥有 Java 8 的一些优点。

如果您知道只有一个调用会执行此操作,则可以从函数中设置全局变量,但这种结构也意味着您必须在某个地方阻塞,直到 zip 完成其工作,然后代码才能移动到下一个逻辑屏幕。

于 2015-05-21T07:48:50.013 回答