2017-09-11 148 views
0

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

  1. 工作1 - 具有状态1,状态2,状态3
  2. 工作2 - 先后状态1,状态2
  3. 工作3 - 有状态1,状态2,状态3,状态4.
  4. 作业4 - 状态为1.

每个状态都有一个API需要被加密。所以我需要让一个进程调用每个API按状态调用,调用所有API并获取每个调用的响应,以便删除内部表的状态,并在完成后放入ProgressBar =隐藏并刷新回收站视图。 我希望能够平行运行,并在所有呼叫完成时获得结果。 我不知道我是否清楚自己的问题,但如果不清楚,我会更详细地解释它或解答您的问题。请你帮忙,我会很高兴。

回答

2

基于这里发布的答案:How can I make this rxjava zip to run in parallel?我建议并行压缩observables。

假设你建立你的调用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 
     }); 
} 
+0

嗨Cani,我现在试试这个以检查是否有效。我稍后会告诉你。谢谢 –

+0

我还有一个问题,你在那里标记选定的作业,并且如果有多个作业,我需要发送所有作业,所以......我是否需要在该查询ZIP上做其他事情来处理所有作业,所有状态,并只得到1最后一个evente? –

+0

是的,我会编辑我的答案。我不确定是否了解您的API的工作方式。对API的调用是否接受作业列表,如'postStatus1(列表作业)'< - 发送状态为1的所有作业,还是必须调用'postStatus1(作业作业)'_many_次? – canihazurcode