2017-09-11 144 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