Operador RxJava para el método de conmutación

Soy nuevo con Rxjava en Android Project, aquí mi código

class RadioListRepositoryImpl(private val apiServices: ApiServices, private val chlDao: ChannelDao) : RadioListRepository { private val results: MutableList<DataResponse> init { results = ArrayList<DataResponse>() } override fun getData(): Observable<DataResponse> { return dataFromMemory().switchIfEmpty(dataFromNetwork()) } override fun dataFromMemory(): Observable<DataResponse> { val cacheDateExp = DateTime().minusHours(6) if(chlDao.isCacheExpinetworking(cacheDateExp).isNotEmpty()){ Logger.d("Get data from cache SQLITE") val chList: MutableList<DataResponse> = ArrayList() val cache = chlDao.loadAll() repeat(cache.size){ i -> val ch = DataResponse() ch.channelId = cache[i].channelId ch.channelTitle = cache[i].title chList.add(ch) } return Observable.from(chList) }else{ chlDao.deleteAll() return Observable.empty<DataResponse>() } } override fun dataFromNetwork(): Observable<DataResponse> { val dttime = DateTime() return apiServices.getChannelList() .concatMap { dataListResponseModel -> Observable.from(dataListResponseModel.radio) } .doOnNext { channelDataResponse -> results.add(channelDataResponse) } .doOnNext { channelDataResponse -> Logger.d("Put data to cache") val c: ChannelEntitiy = ChannelEntitiy() c.channelId = channelDataResponse.channelId c.title = channelDataResponse.channelTitle chlDao.insert(c) } } 

}

Mi otro método de acceso de class getData () y quiero si los datos están vacíos de memory (sqlite) y luego obtengo datos de la networking.

Pero lo que quiero es si los datos están vacíos de la memory, luego obtengo los datos de la inserción de networking en la memory y luego el método getData () devuelve dataFromMemory ()

¿Puedo manejarlo usando otro operador Rx para simplificar mi código?

Cuando desee get datos de fonts múltiples, concat y first deberían ser adecuados para usted.

 // Our sources (left as an exercise for the reader) Observable<Data> memory = ...; Observable<Data> disk = ...; Observable<Data> network = ...; // Retrieve the first source with data Observable<Data> source = Observable .concat(memory, disk, network) .first(); 

concat() toma múltiples Observables y concatena sus secuencias. first() emite solo el primer elemento de una secuencia. Por lo tanto, si usa concat().first() , recupera el primer elemento emitido por múltiples fonts.

La key de este patrón es que concat() solo se suscribe a cada niño Observable cuando lo necesita. No hay consulta innecesaria de fonts más lentas si los datos están en caching, ya que first() detendrá la secuencia anticipadamente. En otras palabras, si la memory arroja un resultado, no nos molestaremos en ir al disco o a la networking. Por el contrario, si ni la memory ni el disco tienen datos, se realizará una nueva request de networking.

Tenga en count que el order de la fuente Observables en concat() importante, ya que los verifica uno a uno.

Luego, si desea save datos para cada fuente, simplemente cambie un poco su fuente con doOnNext()

 Observable<Data> networkWithSave = network.doOnNext(data -> { saveToDisk(data); cacheInMemory(data); }); Observable<Data> diskWithCache = disk.doOnNext(data -> { cacheInMemory(data); }); 
  • Clasificación de objects alfanuméricamente
  • Problemas al analizar datos con RxJava + Kotlin
  • ¿Puedo crear un método de extensión Kotlin para agregar una suscripción rxJava a una suscripción compuesta?
  • Causado por: rx.exceptions.MissingBackpressureException
  • No se puede hacer que la API invoque urlfetch.Fetch en un hilo que no sea el hilo de request original ni un hilo creado por ThreadManager
  • Usando RxJava para unir datos locales con datos remotos (o en caching)
  • RxJava, ¿Qué pasó si no llamo a disponer?
  • Se llama a Android RxJava onNext incluso cuando se anula la suscripción del observador
  • RxJava: cómo devolver el tipo correcto de nulo
  • Solo la primera testing pasa con TestScheduler cuando se ejecutan varias testings (Kotlin)
  • ¿Por qué tengo un Log de salida no deseado al fusionar 2 observables en otro Observable, que los almacena temporalmente cada 10 segundos?