2017-09-11 20 views
0

AndroidでレトロフィットしたRX Javaソリューションをよりよく理解するために質問がありますが、問題は次のとおりです。ローカルデータベースでオフラインモードを使用するアプリケーションがあります私はアプリで作業している、そこにプロセスがデータベースに記録され、それを保存するバックエンドに送信します。 この場合、ジョブの到着ステータスを変更するアクション、ジョブ開始ステータスを変更するアクション、プロセス内のステータスを変更する4つ以上のアクションなど、ステータスを変更するプロセスがあります。このステータスは異なるローカルデータベーステーブルに保存され、ステータスごとにステータス1を変更するために複数のAPI呼び出しを行う必要があります。これを説明すると、私はバックエンドに送信するために保留中のすべてのジョブのすべてのプロセスステータスをグループ化するアプリケーション内の画面を持っているので、この場合はジョブのIDでグループ化されているので、すべてのAPIを呼び出すこの状態をすべて送信し、すべての呼び出しを完了したときに結果を取得して、ロードの進捗状況を確認し、終了時に削除し、すべてのステータスを持つローカルデータベースをクリアし、アクティビティを終了します。 RX JavaにはAPIを呼び出して結果を待つZIPオプションがありますが、この場合、すべてのジョブのすべての同じステータスに対してすべてのAPIを呼び出す必要があるため、この場合はわかりません。 JOB 1、2、3、4retrofitとRXJavaを使用した複数のAPI呼び出し2

  1. ジョブ1を持っている - 状態1、状態2、状態3
  2. ジョブ2を持っています - 状態1、状態2
  3. ジョブ3を持っています - ステータスがあります1、ステータス2、ステータス3、ステータス4。
  4. ジョブ4 - ステータス1あり。

すべてのステータスには、1つのAPIが割り当てられます。すべてのAPIを呼び出し、すべてのコールの応答を取得して内部テーブルのステータスを削除し、すべてが完了したらProgressBar = HideおよびRecycle Viewをリフレッシュするプロセスを作成する必要があります。 私はすべてを並行して実行し、すべての呼び出しが終了したら結果を得るのが好きです。 私は私の問題ではっきりしているかどうか分かりませんが、そうでない場合は、もっと詳しく説明したり質問に答えたりできます。私はあなたの助けに満足しています。

答えて

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

あなたが選択したジョブの並列に実行されるように、あなたの観測を準備する必要があります。

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

私は別の質問があり、あなたが選択した仕事のためにそこに印を付けるので、複数の仕事がある場合はすべての仕事を送る必要があります。その仕事のすべてを処理するために、すべてのステータスを取得し、最終的なイベントを1つだけ取得しますか? –

+0

はい、回答を編集します。私はあなたのAPIの仕組みを理解しているか分かりません。あなたのAPIへの呼び出しは、 'postStatus1(List jobs)' < - のようなジョブのリストを受け入れるか、ステータス1の_all_ジョブを送信するか、 'postStatus1(Job job)' _many_ timesを呼び出さなければなりませんか? – canihazurcode

関連する問題