You subscribe to schedulers.io
when using a Realm instance from a user interface thread:
realm.where(Brand.class) .findAll() .asObservable() .flatMap(Observable::from) .map(brand -> realm.copyFromRealm(brand))
What you need is an easy way to move the request across threads, which is still under development: https://github.com/realm/realm-java/pull/1978 , Until then, you can work around this by doing so :
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); }
Note that Charmisteners Realm only work on Looper streams, which means that you probably need to change the workflow to H
HandlerThread bgThread = new HandlerThread("workerThread"); Handler handler = new Handler(bgThread.getLooper()); getAllBrands(realm).subscribeOn(HandlerScheduler.from(handler));
source share