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.

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 ?

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

https://github.com/juanmendez/Learning-Android-Widgets/blob/06.keepingDBAliveForWidgets/app/src/main/java/info/juanmendez/androidwidget/utils/RealmUtils.java#L23

https://github.com/juanmendez/Learning-Android-Widgets/blob/06.keepingDBAliveForWidgets/app/src/main/java/info/juanmendez/androidwidget/WidgetViewsFactory.java#L28

  • Prueba de unidad de reino en Android
  • ¿Existe una manera de pre-empaquetar la base de datos Realm (default.Realm) a través de React-Native (JS)
  • Limitar el número de llamadas al usar Parse
  • Realm: cambia el nombre del campo para la migración
  • Diferencia entre RealmResults y RealmList
  • RealmList de tipo de cadena en Android
  • Android - Prueba de un recurso de cadena con Robolectric
  • Cómo consultar desde la base de datos realm con resultados distintos java
  • Getter no está asociado a ningún campo - Realm
  • ¿Métodos personalizados en la solución RealmObjects ...?
  • ¿Cómo comprobar si la base de datos .realm ya existe?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.