2016-09-22 47 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

相关问题