Skip to content

Instantly share code, notes, and snippets.

@Augusent
Last active May 17, 2017 18:28
Show Gist options
  • Select an option

  • Save Augusent/68f72d702b6854aa0cdcf07af21d60c8 to your computer and use it in GitHub Desktop.

Select an option

Save Augusent/68f72d702b6854aa0cdcf07af21d60c8 to your computer and use it in GitHub Desktop.
private <E extends RealmObject> Observable<List<E>> getCopiedObjects(Func1<Realm, RealmResults<E>> resultsHandler) {
final HandlerThread handlerThread = new HandlerThread("RealmReadThread", Process.THREAD_PRIORITY_BACKGROUND);
handlerThread.start();
final Scheduler scheduler = AndroidSchedulers.from(handlerThread.getLooper());
final AtomicReference<Realm> realmReference = new AtomicReference<>(null);
return Observable.defer(() -> {
final Realm realm = Realm.getDefaultInstance();
realmReference.set(realm);
return resultsHandler.call(realm).asObservable();
})
.filter(results -> results.isLoaded() && results.isValid())
.map(results -> realmReference.get().copyFromRealm(results))
.subscribeOn(scheduler)
.unsubscribeOn(scheduler)
.doOnUnsubscribe(() -> unsubscribeOnDbThread(handlerThread, realmReference.get()));
}
private <E extends RealmObject> Observable<E> getCopiedObject(Func1<Realm, E> objectHandler) {
final HandlerThread handlerThread = new HandlerThread("RealmReadThread", Process.THREAD_PRIORITY_BACKGROUND);
handlerThread.start();
final Scheduler scheduler = AndroidSchedulers.from(handlerThread.getLooper());
final AtomicReference<Realm> realmReference = new AtomicReference<>(null);
return Observable.defer(() -> {
final Realm realm = Realm.getDefaultInstance();
realmReference.set(realm);
final E object = objectHandler.call(realm);
return object == null ? Observable.empty() : object.asObservable();
})
.filter(realmObject -> realmObject.isLoaded() && realmObject.isValid())
.map(realmObject -> {
//noinspection unchecked
return realmReference.get().copyFromRealm((E) realmObject);
})
.subscribeOn(scheduler)
.unsubscribeOn(scheduler)
.doOnUnsubscribe(() -> unsubscribeOnDbThread(handlerThread, realmReference.get()));
}
private void unsubscribeOnDbThread(HandlerThread handlerThread, Realm realm) {
final Handler handler = new Handler(handlerThread.getLooper());
handler.post(() -> {
realm.close();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
handlerThread.quitSafely();
} else {
handlerThread.quit();
}
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment