将API调用与RX Java组合在一起

我是RXJava的新手,我无法理解如何链接API调用的结果。

我使用retrofit进行了两个API调用,A和B,都返回一个可观察的对象列表。 这两个API调用是独立的,所以我想同时做两个,但为了实现我的最终结果,我需要先拿A的结果,做一些工作,然后结合B的结果来填充我的列表适配器。

  • 使API调用A
  • 使API调用B
  • 取A的结果并创build结果X.
  • 以B + X的结果填充适配器

    @GET("/{object_id}/object_a") Observable<List<Object_A>> getObjectAList( @Path("object_id") long object_id); @GET("/{object_id}/object_b") Observable<List<Object_B>> getObjectBList( @Path("object_id") long object_id); 

这是我迷失在尝试使用RX java的地方。 我可以把api调用的结果作为我的工作,但我不确定如何把我刚刚生成的结果与API调用B结合起来。

 aService. getObjectAList(object_a.getID()) .subscribeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.main) .subscribe(new Action1<List<Object_A>>() { @Override public void call(List<Section> sections) { // Do Stuff Here... // Now i need to take this result and combine it with API Call B... } }); 

我想同时进行这两个API调用,但我不知道如何链接在一起,并结合API调用。 任何帮助是欣赏。

Solutions Collecting From Web of "将API调用与RX Java组合在一起"

像这样的东西?

 Observable .combineLatest(getObjectAList(), getObjectBList(), new Func2<List<Object_A>, List<Object_B>, Object>() { @Override public Object call(List<Object_A>, List<Object_B>) { // Do what you need to do in the background thread List x = createX(o); List y = createY(x, o2); return y; } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<Object>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Object y) { // UI thread, do what you need eg renders the list mAdapter.setList(y); } }); 

照顾replace适当的types应该会使您非常接近解决scheme。

问题是:你如何结合结果?

从List和List构build一个新的结果? 将A对象与B对象组合?

回答这个问题有助于为您的问题find合适的操作员。

合并结果的一个简单例子可以是这样的:

  getObjectAList().zipWith(getObjectBList(), (aList, bList) -> // combine both list to build a new result)).subscribe() 

您可以将列表的元素与另一个操作符(例如combineLatest)结合使用

 aObs = getObjectAList().flatMap(Observable::from); bObs = getObjectBList().flatMap(Observable::from); Observable.combineLatest(aObs, bObs, (a,b) -> // combine a object with b object).subscribe(); 

对于上述所有示例,请求将通过改进并行完成。

我可能会做类似下面的事情

 Observable convertedObservable = getObjectAList .map(object_as -> convertAToX(object_as)); Observable.combineLatest(convertedObservable, getObjectBList, (listx, listb) -> { return listx.addAll(listb); }).subscribeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.main) .subscribe(r -> { setAdapterWith(r); }); 

请记住,这是使用lambdas而不是匿名类,但你应该得到的主要内容。 映射是将一个对象types转换为另一个对象(A的结果为X的结果)的好方法。 所以你可以决定如何converttooX方法为你工作。 然后你可以在转换的AX和B上使用combineLastest来返回更新你的适配器的R的列表

理想情况下,这一切都在某种ViewModel中,getObjectList和getObjectBList可以用Mock observabletesting,你可以很容易地testing所有的逻辑:)