Acceso de dominio a través de subprocesos con rxjava y dagger2
He leído muchos mensajes sobre este tema, pero todavía es un poco poco claro para mí. Entiendo que no puedes acceder a la clase Realm
o objetos de reino a través de diferentes subprocesos, así que me pregunto cuál es la mejor manera de manejar eso.
Tengo un servicio que inicia un hilo. Ese hilo hace trabajo de fondo (incluyendo el trabajo a través de rxjava
en Schedulers.io
). Ahora en un cierto punto quiero guardar algunos datos en el reino que vive en una clase de DataManager. Originalmente estaba usando Dagger2
para inyectar Realm
en mi clase DataManager (que se inyectaba en el servicio). Sin embargo, esto no funcionará ya que la inyección se realizó en el hilo principal, por lo que Realm.getDefaultInstance()
está vinculado al subproceso principal, pero se accede en DataManager desde un subproceso diferente.
- Realm: cambia el nombre del campo para la migración
- Cómo manejar la migración de dominios si los usuarios omitir las actualizaciones
- Manera correcta de obtener el objeto Realm por su clave principal en Android Java
- Android no puede encontrar la dependencia gradle reino
- Un RealmObject sin @PrimaryKey no se puede actualizar
La única opción que puedo imaginar es la de llamar a Realm.getDefaultInstance()
y realm.close()
al principio y al final de cada método que está realizando una transacción. No me importa hacer esto, pero me pregunto si habrá rendimiento de éxito llamando a Realm.getDefaultInstance()
cada vez que quiero guardar un objeto. ¿Hay una mejor manera de hacer esto? Gracias por adelantado.
- Prueba de Realm bajo Android
- Realm.io y consultas asincrónicas
- Abra el reino con una nueva configuración real
- Migración en Realm 0.81.1
- Realm.io Query con GroupBy
- ¿Cuál es la forma correcta de tratar con multithreading y Realm?
- Realm creado con Android en un proyecto no es válido en Otro
- Kotlin uso perezoso
Abordé el problema de roscado mientras usaba Realm en una de mis aplicaciones creando una clase DatabaseManager
que me inyectaba en Actividades y Servicios usando Dagger 2.
Por ejemplo, si tengo una Task
entidad, la clase DatabaseManager
tenía un método void update(Task task)
que obtendría la instancia de Realm por defecto, buscaría la Task
con la ID dada desde la base de datos de Realm, actualizaría la instancia de Task
obtenida en un Transaction block , realm.copyFromRealm(updatedTask);
Y cierre la instancia de Realm al final del método.
Realm realm = Realm.getDefaultInstance(); realm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { // fetch the object from Realm database and update it as required. //https://realm.io/docs/java/latest/api/io/realm/Realm.html#copyFromRealm-E- // Makes an unmanaged in-memory copy of an already persisted RealmObject. realm.copyFromRealm(task); } } }); realm.close();
Funcionó para mí. Si hay un enfoque mejor me gustaría saber más.