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?
- Android RxJava que se une a las listas
- RxJavaCallAdapterFactory no se puede convertir en Factory
- .debounce () de RxJava interfiriendo con los hilos de mis observables y manejo de errores
- RxJava y MVP en la aplicación para Android
- Cómo obtener el patrón NullObject con RxJava
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(); } });
- ¿Cómo se muestra spinner si RxJava observable toma mucho tiempo?
- Cancelar la suscripción de un rx.Single en RxJava
- Creando Observable sin utilizar Observable.create
- Android: Sondeo de un servidor con Retrofit
- ¿Hay RxJava equivalente a Handler.postDelayed (Runnable r, delayMillis largo)
- ¿Cómo puedo implementar el equivalente RxJava de INotifyPropertyChanged para hacer un modelo de datos Observable?
- Observable vs Flujo rxJava2
- Obtenga el objeto JSON uno por uno desde la matriz JSON en Android utilizando Retrofit y RxJava
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.
- Iniciar la aplicación cuando se recibe la notificación de GCM
- Android 4.3+, android: textColorHint no funciona, el color de pista es siempre blanco