Acceso al dominio desde un subproceso incorrecto Android
Estoy lidiando con este problema en Android:
Acceso de dominio desde un subproceso incorrecto. Sólo se puede acceder a los objetos de dominio en el subproceso en el que se crearon.
- Abra el reino con una nueva configuración real
- ¿He usado Singleton con Realm Database correcto?
- Inyección de dependencia en servicio
- Builder (android.content.Context) 'no es público en' io.realm.RealmConfiguration.Builder '. No se puede acceder desde el paquete exterior
- Realm, RxJava, asObservable () y doOnUnsubscribe ()
Quiero usar Realm en mi RemoteViewsFactory con
public class RemoteViewsX implements RemoteViewsFactory { public RemoteViews getViewAt(int paramInt) { if (this.results != null && this.results.size() != 0 && this.results.get(paramInt) != null) { //FAILED HERE }
}
… ¡Esta llamada ha fallado! Por qué ?
Busco mis datos como esto en mi clase:
public void onDataSetChanged() { Realm realm = Realm.getInstance(RemoteViewsX.this.ctx); this.results = realm.where(Model.class).findAll(); }
Llamé a mi remoteFactory así:
public class ScrollWidgetService extends RemoteViewsService { @Override public RemoteViewsFactory onGetViewFactory(Intent intent) { return new RemoteViewsX (getApplicationContext()); } }
Alguna idea ?
- Android no puede encontrar la dependencia gradle reino
- Acceso al dominio desde un subproceso incorrecto Excepción mientras se envió una copia usando copyFromRealm
- Kotlin uso perezoso
- Realm.io / Dagger / Databinding en el mismo proyecto
- Llamando Realm.close () fuera de la actividad
- Escritura y lectura entre subprocesos con Android Realm
- Android RealmList <Integer> y RealmList <String>
- Android Realm: restricción de clave primaria rota. El valor ya existe: 0
Si el problema se produce al llamar onDataSetChanged
y getViewAt
desde otro subproceso, puede obligarlos a utilizar el mismo subproceso, creando su propio HandlerThread
como este:
public class Lock { private boolean isLocked; public synchronized void lock() throws InterruptedException { isLocked = true; while (isLocked) { wait(); } } public synchronized void unlock() { isLocked = false; notify(); } } public class MyHandlerThread extends HandlerThread { private Handler mHandler; public MyHandlerThread() { super("MY_HANDLER_THREAD"); start(); mHandler = new Handler(getLooper()); } public Handler getHandler() { return mHandler; } } public class RemoteViewsX implements RemoteViewsFactory { private MyHandlerThread mHandlerThread; ... } public void onDataSetChanged() { Lock lock = new Lock(); mHandlerThread.getHandler().post(new Runnable() { @Override public void run() { Realm realm = Realm.getInstance(ctx); results = realm.where(Model.class).findAll(); lock.unlock(); } }); lock.lock(); } public RemoteViews getViewAt(int paramInt) { Lock lock = new Lock(); final RemoteViews[] result = {null}; mHandlerThread.getHandler().post(new Runnable() { @Override public void run() { // You can safely access results here. result[0] = new RemoteViews(); lock.unlock(); } }); lock.lock(); return result[0]; }
He copiado Lock
clase Lock
de esta página: http://tutorials.jenkov.com/java-concurrency/locks.html
No olvide quit
el hilo del manejador cuando se realizan las tareas.
Hice uso de un método de clon en mi realmModels. De esa manera puedo hacer una nueva copia que no es dependiente de Realm. Puede incluir los elementos en una RealmList por ejemplo, y eso ayudaría a resolver este problema con Threads.
Esto es de una demostración que hice con Dagger. Espero que tenga sentido, y si tienes preguntas deja un comentario. https://github.com/juanmendez/Learning-Android-Widgets/blob/06.keepingDBAliveForWidgets/app/src/main/java/info/juanmendez/androidwidget/module/AppModule.java#L40
- La aplicación se bloquea cuando se ejecuta desde el teléfono, pero funciona bien cuando se inicia desde el equipo
- Personalización del componente listview