我今天看到一些代码让我感到畏缩,但我不确定如何修复它。
基本上,代码在多次调用时使用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);
将它们一起半链接,然后对结果执行操作:
onNext
很多事情似乎都错了;在.zip调用中设置全局状态,返回null,而不实际使用.zip用于其预期目的。此外,观察者的{{1}}不使用结果,但取决于在.zip中设置全局状态的副作用。
动机是所有这些observable只发出一次(它们是API调用),我们希望在缓存返回的值之前等待它们全部完成,然后进入应用程序中的下一个逻辑屏幕。
我不知道如何处理这个电话。我们不能在我们的Java版本上使用lambda,而且我没有找到一个不是五倍的干净解决方案。
答案 0 :(得分: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;
}
}
答案 1 :(得分:0)
许多Android开发人员使用Retrolambda在构建时执行lambda的后移,并且在保持兼容的同时具有Java 8的一些优点。
如果你知道只有一个调用就可以从函数中设置你的全局变量,但是这个结构也暗示你必须阻塞某个地方,直到zip完成它的工作,然后代码就可以进入下一个逻辑屏幕。