2017-05-31 10 views
0

私はretrofit、rxjava、realmを使ってアプリケーションを構築しています。これは私が達成しようとしているものです:Android - 複数のソースからのデータ

  1. ロードデータを発行ネットワーク要求ローカルDBから、同時に
  2. 初回のみ
  3. をローダーを表示するデータがDBディスプレイにすでに存在する場合はそれとどこかで小さなローダーを表示する
  4. ネットワーク結果が準備完了でリストを更新し、結果をディスクに保存する場合
  5. ネットワークの結果が失敗した場合は、データが古くなる可能性があるというメッセージを表示します。

私はrealmを正しく使用する方法を知っていますが、rxjavaの部分は混乱します。 rxjavaでこれを行う簡単な方法はありますか?あなたが使用することができ、同時に両方の機能を呼び出すには

CategoryRepository.java

public Observable<List<Category>> getCategories() { 
    return getCategoriesFromNetwork() 
      .observeOn(Schedulers.computation()) 
      .doOnNext(this::saveCategoriesToDisk) 
      .publish(nwResponse -> Observable.merge(nwResponse, getCategoriesFromDisk().takeUntil(nwResponse))); 

} 



private Observable<List<Category>> getCategoriesFromNetwork() { 
     return service.getCategories() 
       .map(categoryListResponse -> categoryListResponse.getData()); 
} 


private Observable<List<Category>> getCategoriesFromDisk() { 
     return Observable.just(realm.copyFromRealm(
        realm.where(Category.class).findAll() 
       )); 
} 

のViewModel

categoryRepository.getCategories() 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(categories -> { 
        //Do UI stuff 
       }, throwable -> { 
}); 

答えて

0

を:現在のコードベースがどのように見えるか

はこれがありますZipオペレータまたはcombineLatestオペラトルーマン彼らは本質的に同じですが、私は違いはzipのために2つの新しいobservablesが必要だと思うし、最新のものを見ると、ラムダを続けるために新しいobservableが必要です。

public Observable<List<Category>> getCategories() { 
return Observable.combineLatest(getCategoriesFromNetwork(), getCategoriesFromDisk(), (categoriesFromNet, categoriesFromDisk) -> { 
    categoriesFromNet.addAll(categoriesFromDisk); 
    return categoriesFromNet; 
}) // now you have a complete list of your categories to do with what you want 
+0

どのようにネットワークがまだロードされていることを知っていますか:

は、この何かのリストですか?私はディスクからリストをロードした後にローダーを表示したいと思います。 – Prasanth

関連する問題