Acceso al dominio desde un subproceso incorrecto Excepción mientras se envió una copia usando copyFromRealm

Al copiar secuencias de objetos de dominio en lugar de referencia de dominio y observarlo en el subproceso Schedulers.IO, se produce un bloqueo con el famoso mensaje de excepción "Acceso al dominio desde un subproceso incorrecto. Sólo se puede acceder a los objetos de dominio en el subproceso que se creó".

¿No debería la copia estar libre de hilos? ¿Puedo producirlo desde un hilo y procesarlo en un hilo diferente?

Así es como estoy creando observable.

public Observable<Brand> getAllBrands() { return realm.where(Brand.class) .findAll() .asObservable() .flatMap(Observable::from) .map(brand -> realm.copyFromRealm(brand)); } 

A continuación se muestra cómo observo getAllBrands ().

  Observable<Brand> brandObservable = dataManager.getAllBrands(); brandObservable.observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(new Observer<Brand>() { @Override public void onCompleted() { Log.d("reactive", "completed"); } @Override public void onError(Throwable e) { Log.d("reactive", e.getMessage()); } @Override public void onNext(Brand brand) { dataSource.add(brand.getName()); myAdapter.notifyDataSetChanged(); } }); 

Se está suscribiendo en schedulers.io mientras utiliza la instancia Realm del subproceso de la interfaz de usuario:

 realm.where(Brand.class) .findAll() .asObservable() .flatMap(Observable::from) .map(brand -> realm.copyFromRealm(brand)) // realm instance on the wrong thread .subscribeOn(schedulers.io()); 

¿Qué estás buscando es una forma fácil de mover una consulta a través de subprocesos, que todavía está en progreso aquí: https://github.com/realm/realm-java/pull/1978 . Hasta entonces se puede trabajar en torno a hacerlo por sí mismo como este:

 public Observable<Brand> getAllBrands(final Realm realm) { return Observable.create(new Observable.OnSubscribe<List<Brand>>() { @Override public void call(final Subscriber<? super List<Brand>> subscriber) { Realm obsRealm = Realm.getInstance(realm.getConfiguration()); final RealmResults<Brand> results = obsRealm.where(Brand.class).findAll(); final RealmChangeListener listener = new RealmChangeListener() { @Override public void onChange() { subscriber.onNext(realm.copyFromRealm(results)); } }; results.addChangeListener(listener); subscriber.add(Subscriptions.create(new Action0() { @Override public void call() { realm.removeChangeListener(listener); realm.close(); } })); } }) .flatMap(Observable::from); } 

Tenga en cuenta que Realm Changelisteners sólo funcionan en Looper hilos, lo que significa que probablemente tendrá que cambiar su hilo de trabajo a un H

 HandlerThread bgThread = new HandlerThread("workerThread"); Handler handler = new Handler(bgThread.getLooper()); getAllBrands(realm).subscribeOn(HandlerScheduler.from(handler)); 

PREGUNTA

¿Puedo producirlo desde un hilo y procesarlo en un hilo diferente?

La respuesta es NO. Puedes leer la descripción del reino aquí

Aunque los archivos de Realm pueden accederse simultáneamente por varios subprocesos, no puede entregar Realms, objetos Realm, consultas y resultados entre subprocesos. El ejemplo de hilo muestra cómo usar Realm en un entorno multihilo.

  • Habilitación del botón cuando EditText tiene texto (RxAndroid)
  • ¿Cómo ejecutar 2 consultas secuencialmente en un Android RxJava Observable?
  • Robolectric + rxJava + retrofit Segunda llamada lanza java.io.InterruptedIOException
  • RXJava - Dividir y combinar un Observable
  • Operadores RxJava
  • RxAndroid filter Observable <List <Item >>
  • Combine RxTextView Observable y Retrofit Observable
  • Rx 2 Android ¿qué es mejor Single o Observable para llamadas api?
  • RxJava: "java.lang.IllegalStateException: Sólo un suscriptor permitido!"
  • RxJava Async tarea en Android
  • RxJava: Cómo aplicar condicionalmente a los operadores a un observable sin romper la cadena
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.