【问题标题】:What to do with multiple observables of varying types?如何处理不同类型的多个可观察对象?
【发布时间】:2016-07-03 10:13:54
【问题描述】:

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

基本上,代码在多次调用中使用.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,而且我还没有找到一个不长五倍的干净解决方案。

【问题讨论】:

    标签: java android reactive-programming rx-java rx-android


    【解决方案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;
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-14
        • 1970-01-01
        • 2011-06-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多