通过改造和RXJava 2进行多次API调用

时间:2017-09-11 20:59:38

标签: java android api retrofit2 rx-java2

我有一个问题是为了更好地理解Android中改进的RX Java解决方案,问题如下:我有一个具有本地数据库的离线模式的应用程序,而我正在使用该应用程序,将进程记录到数据库中,然后将其发送到后端进行保存。 在这种情况下,我有一些流程可以更改订单中的状态,例如,我有一个更改工作到达状态的操作,另一个更改工作启动状态的操作,以及另外4个更改流程中状态的操作。此状态将保存到不同的本地数据库表中,并且必须进行多个API调用才能更改每个状态的状态1。解释一下,我的应用程序中有一个屏幕,它将待发送到后端的每个JOB的所有进程状态分组,因此在这种情况下按作业ID分组,所以我想在我的应用程序屏幕中按一个按钮发送所有这些状态调用每个API并在完成所有调用后获得结果以便完成加载进度并在完成时删除它,清除本地数据库以及发送它的所有状态,并完成活动。 我知道RX Java有ZIP选项来调用API并等待结果,但在这种情况下我不知道是否可能,因为我必须为所有作业的每个相同状态调用每个API,例如: 我有工作1,2,3和4。

  1. 作业1 - 状态1,状态2,状态3。
  2. 作业2 - 状态为1,状态为2。
  3. 作业3 - 状态1,状态2,状态3,状态4。
  4. 工作4 - 状态为1。
  5. 每个状态都有1个API供应。所以我需要创建一个进程来调用每个API状态,调用所有API并获得每个调用的响应,以便删除内部表的状态,并在完成所有完成时使用ProgressBar =隐藏和刷新回收器视图。 我想在所有通话结束时并行运行并得到结果。 我不知道我是否清楚我的问题,但如果没有,我会更详细地解释它或回答你的问题。我很乐意帮助你。

1 个答案:

答案 0 :(得分:2)

基于此处发布的答案:How can I make this rxjava zip to run in parallel?我建议并行压缩可观察量。

假设您构建对API的调用:

public class Api {
    @POST("api 1 url")
    Observable<ResponseObject> postStatus1(...);

    @POST("api 2 url")
    Observable<ResponseObject> postStatus2(...);
}

您必须准备好您的observable并行执行所选作业:

private Api api;

public List<Observable<ResponseObject>> prepareObservables(Job job) {
    List<Observable<ResponseObject>> list = new ArrayList<>();

    //Get all states for given job
    for(String status : job.getStates()) {
        // check which api method you need to call
        if(status.equals("STATUS1") {
            //subscribtion on a new thread will ensure calls are executed in parallel                
            list.add(api.postStatus1(...).subscribeOn(Schedulers.newThread()))
        }

        ...
    }

    return list;
}

现在压缩observable并执行

public void runObservables(List<Job> pendingJobs) {
    List<Observable<ResponseObject>> allObservables = new ArrayList<>();

    for(Job job : pendingJobs) {
        list.addAll(prepareObservables(job));
    }

    Observable.zip(allObservables, new Function<Object[], Object>() {
        @Override
        public Object apply(Object[] o) throws Exception {
            // you can combine respones from API here
        }).subscribe(new Consumer<Object>() {
            // this block of code executes when all calls to your api were successfull
            // do what you need to, i.e. delete jobs from db
        });
}
相关问题