java - 在后台线程上创建一个 RealmQuery

标签 java android multithreading realm

我正在尝试实现一个在后台线程上运行的 DBService 类,它有一个方法 Observable getWhere(@NonNull RealmQuery realmQuery)。据我所知,我需要在访问它的同一个线程上创建 Realm 实例。所以,我找到了一种在后台线程上创建 RealmQuery 的方法,但这是一个可怕的黑客攻击。我所有的其他尝试都导致了 java.lang.IllegalStateException: Realm access from incorrect thread。 Realm 对象只能在创建它们的线程上访问

演示者代码:

dataUseCase.searchDisk(getRealmQuery(RepoRealm.class)
                .equalTo("owner.login", userLogin), RepoRealm.class)


public static getRealmQuery RealmQuery(Class clazz) { // horrible hack
    if (handler == null)
        handler = new Handler(getHandlerThread().getLooper());
    handler.postAtFrontOfQueue(() -> realmQuery = RealmQuery.createQuery(Realm.getDefaultInstance(), clazz));
    while (true) if (realmQuery != null) break;
    return realmQuery;
}

getHandlerThread().getLooper() 返回我唯一的后台线程。

数据库服务:

public Observable<List> getWhere(@NonNull RealmQuery realmQuery) {
    return Observable.defer(() -> {
        Realm realm = Realm.getDefaultInstance();
        return realmQuery.findAll().asObservable()
                .filter(results -> ((RealmResults) results).isLoaded())
                .map(o -> realm.copyFromRealm((RealmResults) o))
                .doOnUnsubscribe(() -> closeRealm(realm));
    });
}

我尝试了其他方法,但我总是收到来自错误线程的 Realm 访问异常。

虽然我的解决方案有效,但它可能会卡住我的应用程序一段时间,直到创建 realmQuery,这是我想避免的。有什么建议么?提前致谢。

最佳答案

public <T extends RealmModel> Observable<List<T>> getWhere(RealmQueryProvider<T> queryFactory) {
    return Observable.defer(() -> {
        Realm realm = Realm.getDefaultInstance();
        return queryFactory.create(realm).asObservable()
                .filter(results -> ((RealmResults<T>) results).isLoaded())
                .map(o -> realm.copyFromRealm((RealmResults<T>) o))
                .doOnUnsubscribe(() -> closeRealm(realm));
    });
}

public interface RealmQueryProvider<T extends RealmModel> {
    RealmResults<T> create(Realm realm);
}

// example
Observable<List<Dog>> dogs = dbService.getWhere((realm) -> realm.where(Dog.class).findAll());

关于java - 在后台线程上创建一个 RealmQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41960550/

相关文章:

java - 如何简化 MouseListener 以便我没有所有这些未使用的方法?

Java JEditorPane 用超链接替换选中的文本

iphone - Android/iOS如何使用传感器确定距离的微小变化?

android - 虚拟机开发环境中物理设备上的 USB 调试

java - 如何锁定线程的函数访问

Java TimerTask 应该等待阻塞队列

java - GWT 中按顺序排列更多空格字符

java - Android 设备监视器无法在 Ubuntu 中启动

android - 如何在 Android 中将 Imageview 置于 Listview 下方?

python - 在 Python 中运行游戏循环时多线程显示游戏分数?