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); }); 
  • La biblioteca de Android no puede comstackr kotlin
  • Kotlin: cómo henetworkingar del suscriptor de RxJava
  • RX java / Android cómo lograr este brindis en cada clic usando el operador de rebote
  • Obteniendo una IllegalStateException al usar la API People de Google a pesar de suscribirse a otro hilo usando RxJava
  • Observable.just () que devuelve Unidad en Kotlin
  • Invoque RxJava2 cancelable / desechable del hilo correcto
  • Llamar a un RxJava Single In Kotlin Lambda
  • Asunto de RxJava: escuche el tipo diferente que el que emite
  • ¿Expresar "súper" generics en los types funcionales de Kotlin?
  • No se llama a ninguno de los suscriptores de RxJava onNext / onError / onComplete al encadenar Observables creado desde Observable.create ()
  • El método de callback a menudo para reenviar el evento a Observable?