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?
- RxJava y eventos esporádicos al azar en Android
- Cómo poner en cola las llamadas de la API cuando no está conectado mientras usa Retrofit
- Android: Sondeo de un servidor con Retrofit
- ¿Cómo puedo interceptar un objeto observable y modificarlo en RxJava antes de volver al suscriptor?
- CalledFromWrongThreadException incluso cuando se utiliza AndroidSchedulers.mainThread ()
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(); } });
- Observable vs Flujo rxJava2
- Cómo manejar la rotación con Retrofit y RxJava / RxAndroid en Actividad?
- Android RxJava 2 Prueba JUnit - getMainLooper en android.os.Looper no se burla de RuntimeException
- Comprobación de Internet, dónde colocar al usar MVP, RX y Retrofit
- ¿Cuál es la diferencia entre EventBus y RxJava?
- ¿Por qué debounce () con toList () no funciona en RxAndroid?
- RxJava dividir uno Observable a dos subObservables
- Prueba de desplazamiento sin fin RecyclerView con Espresso 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