如何在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。

Solutions Collecting From Web of "如何在Android中创build一个Observable?"

看看这个教程,因为它确实是你在找什么。 基本上你使用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大理石图 。