¿Cómo crear un Observable en Android?

Lo que quiero hacer es crear una memoria caché en memoria simple para probar los observables fuera. Sin embargo me quedé atascado porque no entiendo cómo crear un observable. Este es el código que he conseguido hasta ahora:

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; } } 

En el getMovies() quiero crear un Observable y devolver mi movieWrapper de campo local al suscriptor. ¿Cómo puedo hacer esto? Intenté usar el new Observable.just(movieWrapper) pero resulta en una excepción nula.

2 Solutions collect form web for “¿Cómo crear un Observable en Android?”

Eche un vistazo a este tutorial ya que hace exactamente lo que está buscando. Básicamente se utiliza defer() para asegurarse de que siempre obtenga la última versión de su objeto en caché:

 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() se cerciora de que usted conseguirá el objeto sobre la suscripción al Observable no en la creación .

Nótese sin embargo que, según el autor de la publicación:

El único inconveniente de aplazar () es que crea un nuevo Observable cada vez que obtiene un suscriptor. Create () puede utilizar la misma función para cada abonado, por lo que es más eficiente. Como siempre, medir el rendimiento y optimizar si es necesario.

Como ya se dijo, la respuesta aceptada tiene desventaja

Crea un nuevo Observable cada vez que obtiene un suscriptor

Pero no es el único.

  • El consumidor no recibirá ningún valor si llama a getMovies().subscribe(...) setCache(...) antes de setCache(...) .
  • El consumidor debe volver a suscribirse si desea recibir cualquier actualización (digamos setCache() se puede llamar varias veces.

Por supuesto, todos ellos pueden ser irrelevantes en su escenario. Sólo quiero mostrarte otra manera (estoy seguro de que hay muchos más). Puede utilizar BehaviorSubject para eliminar todas estas desventajas.

 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 {} } 

Echa un vistazo al diagrama de mármol BehaviorSubject .

  • ¿Es posible obtener 2 valores en onNext () de suscriptor en rxjava android?
  • RxJava- validación de formulario RxAndroid en dynamic EditText
  • Retrofit con Rxjava Schedulers.newThread () vs Schedulers.io ()
  • Cómo manejar correctamente onError dentro de RxJava (Android)?
  • Cómo actualizar la interfaz de usuario desde el servicio de Android utilizando RxJava / RxAndroid
  • Cancelación de varias suscripciones a la vez en RxAndroid - Android
  • RxJava Async tarea en Android
  • Realm, RxJava, asObservable () y doOnUnsubscribe ()
  • RxAndroid: cambios de interfaz de usuario en el subproceso Schedulers.io ()
  • Prueba de RxBinding RxSearchView
  • Encadenar dos observables de adaptación con RxJava
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.