如何使用 RxJava2 的 Zip 运算符?



我有 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
    }
});

最新更新