gpt4 book ai didi

Android Kotlin Realm 查询的正确方法+ 在 Bg 线程上返回非托管项目

转载 作者:行者123 更新时间:2023-11-30 01:04:44 24 4
gpt4 key购买 nike

在后台线程中查询和返回具有 Realm 的项目的非托管结果的正确方法是什么?我正在使用这样的 somethibf:

return Observable.just(1)
.subscribeOn(Schedulers.io())
.map {
val realm = Realm.getDefaultInstance()
val results = realm.where(ItemRealm::class.java)
.equalTo("sent", false).findAll()

realm to results
}
.map {
val (realm, results) = it
val unManagedResults = realm.copyFromRealm(results)
realm.close()
unManagedResults
}
}

然后将这个 observable 与另一个将结果发布到服务器的 observable 链接起来。

解决方案有效,虽然在这方面有点难看:

  • 没有将 realmQuery 包装在可观察对象中的正确方法,因为没有这种作弊方法(至少我知道),无法在后台线程中打开 realInstance,所以我需要使用这个假的可观察的 Observable.just(1)
  • 不是打开和关闭 Realm 实例的最佳位置,在第一张和第二张 map 中

  • 不知道是否保证realm实例在复制完所有item后关闭。

那么在后台线程上查询和返回非托管结果的正确方法是什么(某些情况下,我需要在后台将结果发送到服务器,因为此任务完全独立于我的应用程序当前数据流,所以它应该脱离主线程)。

推荐版本:

return Observable.fromCallable {
Realm.getDefaultInstance().use { realm ->
realm.copyFromRealm(
realm.where(ItemRealm::class.java)
.equalTo(ItemRealm.FIELD_SEND, false).findAll()
)
}
}

最佳答案

这就是将 Realm 对象变为非托管的方式:

    return Observable.defer(() -> {
try(Realm realm = Realm.getDefaultInstance()) {
return Observable.just(
realm.copyFromRealm(
realm.where(ItemRealm.class).equalTo("sent", false).findAll()
)
);
}
}).subscribeOn(Schedulers.io());

虽然这个答案是 Java,但 Kotlin 的答案只差半步。

关于Android Kotlin Realm 查询的正确方法+ 在 Bg 线程上返回非托管项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38981751/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com