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:
- rxjava interval () tiempo de reinicio después de algún evento
- Android RxJava, sin bloqueo?
- Cuándo cancelar una suscripción
- Cómo obtener un Desechable para sujetos como suscriptor en RxJava2
- RxJava: Cómo aplicar condicionalmente a los operadores a un observable sin romper la cadena
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.
- ¿Cómo actualizar observable en RxJava?
- RxJava Break Chain en Condicional
- ¿Cómo se muestra spinner si RxJava observable toma mucho tiempo?
- RxJava No puede crear el controlador dentro de hilo que no ha llamado Looper.prepare ()
- ¿Cuál es la manera correcta de burlarse de un RxJava Observable
- Cómo crear un objeto retrofit.Response durante las pruebas de unidad con Retrofit 2
- Cómo utilizar rxandroid para escuchar la actualización de ubicación de gps
- Android Pros y Contras: Event Bus y RxJava
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.
- Android 'InvocationTargetException' y 'UnsupportedOperationException'
- ObjectAnimator.ofFloat no puede tomar Int como parámetros directamente en kotlin