2017-10-16 16 views
0

AsyncTask(doInBackgroundメソッド)から次のコードをRxJavaに変更するにはどうすればよいですか?AsyncTaskからRxJavaへの改造要求サイクル

private String getNextUrl(Call<MessageRs> response, MessageRq rq) throws Exception { 
     Response<MessageRs> rs = response.execute(); 
     rq.setData(...); 
     ... 
     return rs.body().getLink(); 
} 

私はObservable<MessageRs>Call<MessageRs>を交換し、私が理解から、私はflatMapが必要になります。

MessageRq rq = new MessageRq(); 
rq.setId(id); 
Call<MessageRs> response = App.getApi().getFirstCommand(rq); 
nextLink = getNextUrl(response, rq); 
for (int i = 0; i< 10; i++) { 
    response = App.getApi().authorize(nextLink, rq); 
    nextLink = getNextUrl(response, rq); 
} 

getNextUrl方法は次のようになります。しかし、私はそれを正しく使用する方法を理解していない...あなたが直面している

myApi.getFirstCommand(rq) 
     .subscribeOn(Schedulers.newThread()) 
     .flatMap(response -> { // How can I transfer here both response and rq? 
      // and how to do it exactly 10 times?  
      // maybe after flatMap I should add .forEachWhile(cycle < 10) ?  
      String nextLink = getNextUrl(response, rq); 
      myApi.authorize(nextLink, rq); 
     }) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(// from what I understand, here I should update UI, right?); 

答えて

0

問題がrqはパラメータで更新する必要が変更可能なオブジェクトであるということである、などのようなオブジェクトが実際に再生されませんRxJavaの機能的なアプローチとよく似ています。つまり、まだ変更可能な状態で作業することは可能ですが、パラレル更新には注意が必要です。

myApi.getFirstCommand(rq) 
     .subscribeOn(Schedulers.newThread()) 
     .flatMap(response -> getNextUrlObservable(rq, response), 1) 
     .flatMap(response -> getNextUrlObservable(rq, response), 1) 
     .flatMap(response -> getNextUrlObservable(rq, response), 1) 
     .flatMap(response -> getNextUrlObservable(rq, response), 1) 
     .flatMap(response -> getNextUrlObservable(rq, response), 1) 
     .flatMap(response -> getNextUrlObservable(rq, response), 1) 
     .flatMap(response -> getNextUrlObservable(rq, response), 1) 
     .flatMap(response -> getNextUrlObservable(rq, response), 1) 
     .flatMap(response -> getNextUrlObservable(rq, response), 1) 
     .flatMap(response -> getNextUrlObservable(rq, response), 1) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(// from what I understand, here I should update UI, right?); 

この配列が並行して行われていないことを確認する必要がある最初の変化はflatMap() 2番目のパラメータであり、使用することができるスレッドの最大数は、入力を評価示します。各ステップにtake(1)を適用することによって、これを強制することもできます。

可観測チェーンでは反復を直接実行することはできません。オブザーバーチェーンを構築したり、オンザフライでチェーンを構築したり、compose()オペレーターを使用したりすることが可能です。

関連する問題