如何在Android RxJava中使用flatMap来顺序进行三次Web服务调用而不使用lambda函数?

时间:2018-04-08 11:14:35

标签: android retrofit2 rx-java2

我的API客户端

public class ApiClient {
    public static final String BASE_URL = "http://baseurl.com/wp-json/";
    private static Retrofit retrofit = null;


    public static Retrofit getClient() {
        if (retrofit==null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

我的端点接口

    public interface ApiInterface {

        @GET("posts/category/politics/recent-stories/")
        Observable<ArrayList<ModelNewsPaged>> getPoliticsArrayListObservable(@Query("per_page") int perPage, @Query("page") int page);

        @GET("posts/category/economy/recent-stories/")
        Observable<ArrayList<ModelNewsPaged>> getEconomyArrayListObservable(@Query("per_page") int perPage, @Query("page") int page);

        @GET("posts/category/sports/recent-stories/")
        Observable<ArrayList<ModelNewsPaged>> getSportsArrayListObservable(@Query("per_page") int perPage, @Query("page") int page);
    }

如何使web服务首先按顺序调用getPoliticsArrayListObservable,然后使用flatMap&amp; amp; getEconomyArrayListObservable和getSportsArrayListObservable调用。不使用lambda函数?

我试过这样的事情:

final ApiInterface apiInterface = ApiClient.getClient().create(ApiInterface.class);

        Observable.just(apiInterface)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .flatMap(new Function<ApiInterface, Observable<ArrayList<ModelNewsPaged>>>() {
                    @Override
                    public Observable<ArrayList<ModelNewsPaged>> apply(ApiInterface apiInterface) throws Exception {
                        return apiInterface.getPoliticsArrayListObservable(10,1);
                    }
                })
                .subscribe(new Observer<ArrayList<ModelNewsPaged>>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onComplete() {
                        Log.d("flatMap", "onComplete");
                    }

                    @Override
                    public void onError(Throwable e) {
                        e.printStackTrace();
                        Log.d("flatMap", "onError");
                    }

                    @Override
                    public void onNext(ArrayList<ModelNewsPaged> integer) {
                        Log.d("flatMap", "Final result: " + integer.toString());
                    }
                });

但问题是,我无法再连接任何flatMap方法。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以使用RxJava的Concat运算符按顺序进行API调用。如果您不关心序列,可以使用Zip。

好吧,我可能会这样做。 如果您没有与它们保持开放连接,则应将API调用视为单个。

EditText