我有 2 个来自 Retrofit 的调用,它从 2 个不同的 Subreddit 中提取图像。我需要有关如何使用运算符在单个列表中获取两个结果observables#zip()
帮助。如果有人能帮助我,我将不胜感激。
以下是改造配置:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://www.reddit.com/r/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
RedditAPI backendApi = retrofit.create(RedditAPI.class);
我正在创建一个可观察量列表来存储多个调用的结果:
List<Observable<?>> requests = new ArrayList<>();
requests.add((Observable<?>) backendApi.getpics());
requests.add((Observable<?>) backendApi.getearthporn());
我无法弄清楚 Zip 运算符的正确用法。这是我所拥有的:
Observable.zip(
requests,
new Function<Object[], Object>() {
@Override
public Object apply(Object[] objects) throws Exception {
return new Object();
}
}).subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
Log.d(TAG, "accept: "+o.toString());
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable e) throws Exception {
Log.d(TAG, "accept: " + e.getLocalizedMessage());
}
}
);
}
我正在创建一个Reddit照片应用程序。我成功地调用了每个单独的请求,这意味着我的改造界面正在工作。但是,我不知道如何使用zip
运算符组合多个请求。代码运行时,我会FATAL Exception: Main error
。
在你的apply
函数中。可以将objects
数组强制转换为模型类类型。假设您的改造界面如下所示:
@GET("some")
Observable<SubredditBody> getPics();
@GET("somemore")
Observable<SubredditBody> getEarthPorn();
// I have no idea what your the actual rest endpoints are but I'm assuming you
// already have this portion down.
您可以循环浏览结果:
new Function<Object[], Object>() {
@Override
public Object apply(Object[] objects) throws Exception {
for (Object object : objects) {
// Do something interesting here. This array has the result of your two API calls.
if (object instanceOf SubredditBody) {
SubredditBody body = (SubredditBody) object;
}
}
// Return your cool new object however you want. I didn't show how to
// instantiate this object but that's really up to you and your business
// logic.
return object;
}
}
在此签名中声明的第二种类型是你将在订阅中收到的类型,如下所示:
new Function<Object[], YourCoolNewType>() {
...
}).subscribe(new Consumer<YourCoolNewType>() {
@Override
public void accept(YourCoolNewType o) throws Exception {
// Do something here
}
});