Android Kotlin Realm正确的查询方式+返回Bg主题上的非托管项目

什么是正确的方式来查询和返回领域项目的非托管结果,在后台线程中的一切? 我正在使用这样的一些thibf:

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 } } 

然后将这个可观察元素与另一个将结果发布到服务器的元素链接起来。

解决方案的工作,虽然在这方面有点难看:

  • 没有适当的方式来包装realmQuery在一个可观察的,因为没有这样的作弊(至少我知道)在后台线程中打开一个realInstance的方式,所以我需要使用这个假的可观察Observable.just(1)
  • 不是在第一张和第二张地图内打开和关闭Realm实例的最佳位置

  • 我不知道在复制所有项目后是否保证领域实例是关闭的。

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

建议版本:

 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的答案只是一步之遥。