如何在Android中创build一个Observable?

我想要做的是创build一个简单的内存caching,只是为了试用Observables。 但是我被卡住,因为我不明白如何创build一个可观察的。 这是我到目前为止的代码:

public class MovieCache { MovieWrapper movieWrapper; public Observable<MovieWrapper> getMovies() { //How to create and return an Observable<MovieWrapper> here? } public void setCache(MovieWrapper wrapper) { movieWrapper = wrapper; } public void clearCache() { movieWrapper = null; } } 

getMovies()方法中,我想创build一个Observable并将我的本地字段movieWrapper返回给订阅者。 我怎样才能做到这一点? 我尝试使用new Observable.just(movieWrapper)但它导致一个空的exception。

  • 连锁两个改装observbles w / RxJava
  • 是否有可能在rxjava android中的订阅者的onNext()中获得2个值?
  • rxjava中的后台任务队列
  • 为什么RxJava与Android上的改造doOnError()不起作用,但Subscriber onError
  • 如何处理使用RxJava的回收站视图的项目点击
  • 将AsyncTask转换为RxAndroid
  • 使用RxJava来获取对象,转换一个包含列表,并使用列表
  • 使用RXJava获取标题信息和改进
  • 看看这个教程,因为它确实是你在找什么。 基本上你使用defer()来确保你总是得到最新版本的caching对象:

     public class MovieCache { MovieWrapper movieWrapper; public Observable<MovieWrapper> getMovies() { return Observable.defer(new Func0<Observable<MovieWrapper>>() { @Override public Observable<MovieWrapper> call() { return Observable.just(movieWrapper); } }); } public void setCache(MovieWrapper wrapper) { movieWrapper = wrapper; } public void clearCache() { movieWrapper = null; } } 

    defer()确保在订阅 Observable不会在创build时获得对象。

    但请注意,根据该职位的作者:

    推迟()的唯一缺点是每次获得订户时都会创build一个新的Observable。 create()可以为每个用户使用相同的function,所以效率更高。 一如既往,衡量性能并在必要时进行优化。

    如前所述,接受的答案有不利之处

    它会在每次获得订户时创build一个新的Observable

    但它不是唯一的一个。

    • 如果在调用setCache(...)之前调用getMovies().subscribe(...) ,Consumer将不会收到任何值。
    • 消费者应该重新订阅,如果他想接收任何更新(比方说setCache()可以多次调用。

    当然,在你的情况下,他们都可能是无关紧要的。 我只是想向你展示另一种方式(我相信还有更多)。 您可以使用BehaviorSubject来消除所有这些缺点。

     public class MovieCache { private BehaviorSubject<MovieWrapper> mMovieCache = BehaviorSubject.create(); public void setCache(MovieWrapper wrapper) { mMovieCache.onNext(wrapper); } public Observable<MovieWrapper> getMovieObservable() { //use this if consumer want to receive all updates return mMovieCache.asObservable(); } public MovieWrapper getMovie() { //use this if consumer want to get only current value //and not interested in updates return mMovieCache.getValue(); } public void clearCache() { //CAUTION consumer should be ready to receive null value mMovieCache.onNext(null); //another way is to call mMovieCache.onCompleted(); //in this case consumer should be ready to resubcribe } public static class MovieWrapper {} } 

    看看BehaviorSubject大理石图 。