2017-03-01 42 views
0

我需要显示用户启动应用程序时它们来自我的数据库的数据(它们立即可用),然后,我需要用即将来自网络的数据替换它们因为它们可用。使用RXJava顺序拨打电话

mDisposable = mRepository.getHighlights(forceReload) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribeWith(new DisposableObserver<PaginatedData<List<Article>>>() { 
      @Override 
      public void onNext(PaginatedData<List<Article>> articles) { 
       mView.updateData(articles.getData(), articles.isFirstPage(), articles.isLastPage()); 
      } 

      @Override 
      public void onError(Throwable e) { 

      } 

      @Override 
      public void onComplete() { 
      } 
     }); 

而且getHighlights()方法:

我这样做是想这

return Observable.concat(getHighlightsFromDataBase(), getHighlightsFromNetwork()).map(new Function<List<ArticleResponse>, PaginatedData<List<ArticleResponse>>>() { 
      @Override 
      public PaginatedData<List<ArticleResponse>> apply(@NonNull List<ArticleResponse> articleResponses) throws Exception { 
       // ... 
      } 
     }); 

的问题是,它仅调用 “申请()”(在 “地图”方法)当getHighlightsFromDataBase()和getHighlightsFromNetwork()完成时。

所以不是有这个顺序:

getHighlightsFromDataBase() 
getHighlightsFromNetwork() 
map() 
onNext() 
map() 
onNext() 

我需要有:

getHighlightsFromDataBase() 
map() 
onNext() 
getHighlightsFromNetwork() 
map() 
onNext() 

的 “onNext” 是我说的是调用getHighlights方法的onNext ();(这样我可以在每次获得新数据时更新视图)。

我该怎么做才能做到这一点?

谢谢!

+0

那么,为什么你不简单地应用地图每个observable分开? – yosriz

+1

我想说你的代码看起来很好,应该做你想做的事:首先从数据库加载,然后从网络加载。然而,'getHighlightsFromDatabase'发出'onCompleted'后,'concat'将会订阅'getHighlightsFromNetwork()'。如果我没有弄错,可能是来自'getHighlightsFromDatabase'的最后/唯一一个项目通过'map'之前或之后。您可能想尝试添加一些人为延迟来更清晰地查看行为。 –

+0

噢,以防万一你的“预期顺序”部分比我想象的更加直接:*当然*'getHighlightsFromNetwork()'将在开始时被调用 - 因为它被用作参数'concat',它需要在你进入map之前进行评估 - 毕竟,Java仍然有严格的(而不是懒惰的)评估。然而,'getHighlightsFromNetwork'必须返回一个'Observable',并且* Observable *的订阅将是懒惰的 - 正如我上面所说的那样,它会在'getHighlightsFromDataBase'的'onCompleted'后面发生。 –

回答

0

像这样的东西?

getHighlightsFromDataBase().map().doOnNext() {  
     getHighlightsFromNetwork().map().onNext() 
    }