2017-10-16 58 views
0

如何从AsyncTask(从doInBackground方法)将以下代码更改为RxJava?从AsyncTask到RxJava的改造请求周期

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方法是这样的:

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

我换成Call<MessageRs>Observable<MessageRs>和,从我的理解,我需要flatMap。但我不明白如何正确地使用它...

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(),这表明可以使用评估的输入的最大线程数的第一个变化。您也可以通过将take(1)应用于每一步来强制执行此操作。

您不能直接在可观察链中执行迭代。建立一个观察链,构建链中的链或使用运营商很可能是可能的。