繁体   English   中英

带有翻新和RXJava 2的多个API调用

[英]Multiple API calls with retrofit and RXJava 2

我有一个问题是为了更好地理解Android上的RX Java解决方案,其问题如下:我有一个具有本地数据库离线模式的应用程序,而我正在使用该应用程序进行处理被记录到数据库中,然后将其发送到后端进行保存。 在这种情况下,我有一些按顺序更改状态的流程,例如,我有一个更改工作到达状态的动作,另一个有更改工作开始状态的动作,还有另外4个更改a流程状态的动作。 此状态将保存到不同的本地数据库表中,并且必须进行多个API调用才能将每个状态更改为1。 对此进行解释,我的应用程序中有一个屏幕,该屏幕将所有等待发送给后端的JOB的所有进程状态进行分组,因此在这种情况下按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。

每个状态都有1个API。 因此,我需要创建一个流程,以按状态调用每个API,调用所有API并获取每个调用的响应,以便删除内部表的状态,并在所有操作完成后放入ProgressBar =隐藏并刷新回收者视图。 我想并行运行所有程序,并在所有调用结束时得到结果。 我不知道我是否清楚自己的问题,但如果不明确,我会更详细地解释它或回答您的问题。 请为您的帮助我感到高兴。

根据此处发布的答案: 如何使该rxjava zip并行运行? 我建议并行压缩可观察对象。

假设您这样构建对API的调用:

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

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

您必须准备要并行执行的可观测对象以执行所选作业:

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;
}

现在压缩可观察对象并执行

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM