我是RXJava的新手,我无法理解如何将API调用的结果链接在一起.
我正在使用改造A和B进行两次API调用,它们都返回一个可观察的对象列表.两个API调用都是独立的,所以我想同时制作两个,但要实现我的最终结果,我需要先取结果A,做一些工作,然后将它与B的结果结合起来填充我的列表适配器.
获取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);
Run Code Online (Sandbox Code Playgroud)这是我试图使用RX java迷路的地方.我可以接受api调用A的结果并完成我的工作,但我不确定如何获取我刚刚生成的结果并将其与API Call 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...
}
});
Run Code Online (Sandbox Code Playgroud)
我想同时进行两个API调用,但我不确定如何链接在一起并组合API调用.任何帮助都是值得赞赏的.
Iva*_*llo 11
像这样的东西?
Observable
// make api call for A list and B list
.combineLatest(getObjectAList(), getObjectBList(), new Func2<List<Object_A>, List<Object_B>, Object>() {
@Override
public Object call(List<Object_A> o, List<Object_B> o2) {
// 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 e.g. renders the list
mAdapter.setList(y);
}
});
Run Code Online (Sandbox Code Playgroud)
注意更换正确的类型应该让你非常接近解决方案.
问题是:您将如何合并结果?
从 List 和 List 构建新结果?将 A 对象与 B 对象合并 ?
回答此问题有助于找到适合您问题的操作员。
组合结果的一个简单示例如下:
getObjectAList().zipWith(getObjectBList(), (aList, bList) -> // combine both list to build a new result)).subscribe()
Run Code Online (Sandbox Code Playgroud)
您也可以将列表的元素与另一个运算符组合(例如,combineLatest)
aObs = getObjectAList().flatMap(Observable::from);
bObs = getObjectBList().flatMap(Observable::from);
Observable.combineLatest(aObs, bObs, (a,b) -> // combine a object with b object).subscribe();
Run Code Online (Sandbox Code Playgroud)
对于上述所有示例,请求将通过改造并行完成。
| 归档时间: |
|
| 查看次数: |
13750 次 |
| 最近记录: |