¿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.

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 .

  • No se puede convertir el objeto Subclase en cuerpo de solicitud json en Retrofit 2.0 con GsonConverterFactory
  • Rx java retrofit 2 manejo de errores
  • RxJava2 función de rebote no funciona correctamente en RecyclerView - Android
  • RxJava: ¿Cómo reanudar el trabajo de un observable si se produce un cambio de configuración?
  • Encontrar falta onError en el proyecto
  • Cómo crear un objeto retrofit.Response durante las pruebas de unidad con Retrofit 2
  • Encadenamiento de solicitudes en Retrofit + RxJava
  • Android RxJava 2 Prueba JUnit - getMainLooper en android.os.Looper no se burla de RuntimeException
  • RxAndroid, bus de eventos y ciclo de vida de la actividad
  • Encadenamiento de dos llamadas de servicio web mediante RxJava y Retrofit
  • No se puede verificar la llamada de método de simulación desde el suscriptor de RxJava
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.