2016-09-22 64 views

回答

2

創建訂閱,它通過改造服務下載數據並持續到您堅持的對象變成這樣

try(Realm r = Realm.getDefaultInstance()) { // on background thread 
    r.executeTransaction((realm) -> { 
     Cat defaultCat = new Cat(); 
     long rank; 
     if(realm.where(Cat.class).count() > 0) { 
      rank = realm.where(Cat.class).max(CatFields.RANK).longValue(); 
     } else { 
      rank = 0; 
     } 
     for(CatBO catBO : catsBO.getCats()) { 
      defaultCat.setId(catBO.getId()); 
      defaultCat.setRank(++rank); 
      defaultCat.setSourceUrl(catBO.getSourceUrl()); 
      defaultCat.setUrl(catBO.getUrl()); 
      realm.insertOrUpdate(defaultCat); 
     } 
    }); 
} 

王國的境界

Subscription downloadCats = Observable.create(new RecyclerViewScrollBottomOnSubscribe(recyclerView)) 
      .filter(isScroll -> isScroll || realm.where(Cat.class).count() <= 0) 
      .switchMap(isScroll -> catService.getCats().subscribeOn(Schedulers.io())) // 
      .retry() 
      .subscribe(catsBO -> { 
       catPersister.persist(catsBO); 
      }, throwable -> { 
       Log.e(TAG, "An error occurred", throwable); 
      }); 
    compositeSubscription.add(downloadCats); 

和顯示數據,並隨時向日期在您的UI線程與

  • RealmRecyclerViewAdapter
  • 或通過realm.where(Cat.class).findAllSortedAsync(...).asObservable().filter(RealmResults::isLoaded).subscribe()另一個訂閱:

recyclerView.setAdapter(new CatAdapter(getContext(), 
      realm.where(Cat.class).findAllSortedAsync(CatFields.RANK, Sort.ASCENDING))); 

return RxTextView.textChanges(editText).switchMap(charSequence -> 
      realm.where(Dog.class) 
        .contains(DogFields.NAME, charSequence.toString()) 
        .findAllAsync() 
        .asObservable() 
    ).filter(RealmResults::isLoaded) 
    .subscribe(dogs -> { 
      adapter.updateData(dogs); 
    }); 
+0

我使用的MVP模塊 –

+0

嗯,這是規範的境界+ RxJava使用。把它翻譯成你的Presenter並用'share()'暴露'RxTextView.textChanges()'作爲一個可觀察對象,並且將自己綁定到Presenter中,完全取決於你。我不打算添加「乾淨的代碼」解決方案,因爲[它涉及從零複製數據庫複製](http://stackoverflow.com/a/38983203/2413303),這對我來說沒有意義 – EpicPandaForce

相關問題