2017-10-09 46 views
0

我只有這個:如何使用RxJava獲得來自Realm的物品列表的Observable?

public Observable<List<Movie>> getAll() { 
    return Observable.just(Movie.class) 
      .flatMap(t -> Observable.just(t) 
        .doOnSubscribe(disposable -> realm.executeTransaction(realm1 -> realm1.where(Movie.class).findAll())) 
        .onErrorResumeNext((ObservableSource<? extends Class<Movie>>) observer -> Observable.empty()) 
        .map(all -> realm.where(Movie.class).findAll()) 
      ); 
} 

但它看起來真的很醜))

一切會好起來的,如果有其中的可能性,以避免重複的代碼,並保存realm.where(Movie.class).findAll ()並在map()中重用。 RealmResults方法addAll已棄用。

+1

我想你應該閱讀[這](https://academy.realm.io/posts/creating-a-reactive-data-layer-with-realm-and-rxjava2/),並且檢查[這](https://stackoverflow.com/a/44341905/6774854)回答。 – masp

+0

我不認爲,這將工作,因爲Observable.empty只會發射onComplete。所以你會得到一個完成的observable。 –

+0

@masp感謝鏈接我的答案,不幸的是,那邊的提問者放棄了他的問題,所以我不能將其標記爲重複。悲慘的人生... – EpicPandaForce

回答

0

也如描述here

private io.reactivex.Flowable<List<Movie>> getAll() { 
    return io.reactivex.Flowable.create(new FlowableOnSubscribe<List<Movie>>() { 
     @Override 
     public void subscribe(FlowableEmitter<List<Movie>> emitter) 
       throws Exception { 
      Realm realm = Realm.getDefaultInstance(); 
      RealmResults<Movie> results = realm.where(Movie.class).findAllAsync(); 
      final RealmChangeListener<RealmResults<Movie>> listener = _realm -> { 
       if(!emitter.isUnsubscribed() && results.isLoaded()) { 
        emitter.onNext(results); 
       } 
      }; 
      emitter.setDisposable(Disposables.fromRunnable(() -> { 
       results.removeChangeListener(listener); 
       realm.close(); 
      })); 
      results.addChangeListener(listener); 
     } 
    }, BackpressureStrategy.LATEST) 
    .subscribeOn(AndroidSchedulers.mainThread()) 
    .unsubscribeOn(AndroidSchedulers.mainThread()); 

但作爲@masp說,評論,您可以閱讀更多有關在設計使用my article about this on realm.io that was published a month ago與境界一RxJava2反應數據層。

因此,與境界4.0.0-RC1及以上的,實際上你可以只是做

private io.reactivex.Flowable<List<Movie>> getAll(Realm realm) { 
    if(realm.isAutoRefresh()) { 
     return realm.where(Movie.class) 
       .findAllAsync() 
       .asFlowable() 
       .filter(RealmResults::isLoaded); 
    } else { // for background threads 
     return Flowable.just(realm.where(Movie.class).findAll()); 
    } 
} 
0

您可以隨時提取的另一種方法找到的電影被重用的代碼。即使在功能性API中,我們也應該避免中斷DRY。

public void code() { 
    public Observable<List<Movie>> getAll() { 
     return Observable.just(Movie.class) 
       .flatMap(t -> Observable.just(t) 
         .doOnSubscribe(disposable -> realm.executeTransaction(realm1 -> findMovie((Object) realm1))) 
         .onErrorResumeNext((ObservableSource<? extends Class<Movie>>) observer -> Observable.empty()) 
         .map(all -> findMovie((Object) all)) 
       ); 
    } 

} 

private Object findMovie(Object realm1) { 
    return realm1.where(Movie.class).findAll(); 
} 
相關問題