Realm + Retrofit + Rxjava

Estoy tratando de encontrar una manera de salvar a mi Parsed objetos de retro en el reino a través de rxjava observable.

Ahora mismo tengo una llamada a la API:

fetchCatalogData().subscribeOn(Schedulers.io()) .subscribe(data -> saveToRealm(); ) 

Esto no funciona porque yo estoy usando el reino en diferentes bandas o que scheduler.io no tiene un looper. No estoy seguro de cuál es la mejor manera de trabajar con retrofit, reino y rxjava. Quiero ser capaz de guardar todos mis datos cuando llega de retrofit y luego acceder a ella después.

Usted puede aprovechar una muy buena biblioteca que combina todo.

https://github.com/FabianTerhorst/ApiClient

"Un cliente api fácil de usar que combina el poder de Retrofit, Realm, Gson, Rxjava y Retrolambda en una biblioteca fácil de usar para Java y Android"

En realidad es bastante simple, todo lo que necesita hacer es tener dos flujos diferentes – uno para la descarga, y otro para mostrar los datos.

Estoy suponiendo fetchCatalogData() devuelve los datos a través de Retrofit, por lo tanto, los objetos no administrados.

 fetchCatalogData() .subscribeOn(Schedulers.io()) .subscribe(data -> saveToRealm(data); ) 

En este caso, esto funciona bien, siempre y cuando saveToRealm() abra una instancia de realm de thread específica:

 private void saveToRealm(CatalogData data) { try(Realm r = Realm.getDefaultInstance()) { r.executeTransaction((realm) -> { realm.insertOrUpdate(data); }); } } 

Esto le permitiría crear un reino (que se auto-cierre) en el hilo de fondo, y persistir en el Reino.


Para el subproceso UI, crearía una consulta para CatalogData y, a través de RxJava-support de Realm, obtendrá un RealmChangeListener añadido al conjunto de resultados y recibirá un "observable caliente" que le dará los resultados siempre que cambie la tabla subyacente.

 Subscription showCatalog = realm.where(CatalogData.class) .findAllAsync() .filter(RealmResults::isLoaded) .filter(RealmResults::isValid) .subscribe((results) -> { adapter.updateData(results); }); 

Pero un ejemplo similar se puede ver en la página de "documentación" de Realm de Stack Overflow .

Realm trabaja con Retrofit 1. * y 2. * fuera de la caja, pero tenga en cuenta que Retrofit no agrega objetos automáticamente a Realm, sino que debe agregarlos manualmente utilizando los métodos realm.copyToRealm() o realm.copyToRealmOrUpdate() .

 GitHubService service = restAdapter.create(GitHubService.class); List<Repo> repos = service.listRepos("octocat"); // Copy elements from Retrofit to Realm to persist them. realm.beginTransaction(); List<Repo> realmRepos = realm.copyToRealmOrUpdate(repos); realm.commitTransaction(); 

También Realm tiene un soporte de primera clase para RxJava, lo que significa que las siguientes clases de Realm pueden ser expuestas como un Observable : Realm , RealmResults , RealmObject , DynamicRealm y DynamicRealmObject .

 // Combining Realm, Retrofit and RxJava (Using Retrolambda syntax for brevity) // Load all persons and merge them with their latest stats from GitHub (if they have any) Realm realm = Realm.getDefaultInstance(); GitHubService api = retrofit.create(GitHubService.class); realm.where(Person.class).isNotNull("username").findAllAsync().asObservable() .filter(persons.isLoaded) .flatMap(persons -> Observable.from(persons)) .flatMap(person -> api.user(person.getGithubUserName()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(user -> showUser(user)); 

Esto esta docs oficiales del reino.

  • RxJava - Encadenamiento de solicitudes y actualización de la interfaz de usuario
  • Cómo obtener el patrón NullObject con RxJava
  • Compartiendo RxBindings Eventos observables entre múltiples suscriptores
  • Prueba de unidad JVM con Mockito para pruebas Retrofit2 y RxJava para solicitudes de red
  • Encadenamiento de servicios de Retrofit con soporte de RxJava
  • Rxandroid pide que se ejecute en el hilo ui aunque esté suscrito en AndroidSchedulers.mainThread ()
  • RxJava: "java.lang.IllegalStateException: Sólo un suscriptor permitido!"
  • Rx 2 Android ¿qué es mejor Single o Observable para llamadas api?
  • Obtención de información de encabezado con RXJava y Retrofit
  • Comportamiento de onNext y onComplete
  • Filtrar lista de objetos en Rxjava
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.