¿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.
- Rx Observable emitiendo valores periódicamente
- Robolectric + rxJava + retrofit Segunda llamada lanza java.io.InterruptedIOException
- Uso de "skipWhile" combinado con "repeatWhen" en RxJava para implementar el sondeo de servidor
- RxJava Async tarea en Android
- Progreso de descarga con RxJava, OkHttp y Okio en Android
- Android rxJava Manejo de errores con retroadaptación
- Prueba de unidad de Android con Retrofit / RxJava / Roboletric y Mockito
- RxJava + Retrofit + sondeo
- ¿Existe una regla de proguard válida para RxJava y FasterXML?
- Dar un RxJava Observable algo a emitir de otro método
- ¿Existe algún patrón de desarrollo que pueda reemplazar un IntentService para las solicitudes de red?
- ¿Cómo actualizar observable en RxJava?
- Retrofit con rxjava manejando excepciones de red a nivel mundial
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 desetCache(...)
. - 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 .
- Cómo agregar TableRow de xml a TableLayout mediante programación?
- PhoneGap + JQuery Mobile + Google Maps v3: mapa muestra azulejos de la parte superior izquierda?