【问题标题】:Realm instance for observable query is closed by another query可观察查询的领域实例被另一个查询关闭
【发布时间】:2018-01-04 09:31:25
【问题描述】:

我的领域实例有问题。我只使用领域默认实例。对于每个查询/更新操作,我使用 Realm.getDefaultInstance() 获得一个领域实例,并在完成操作后关闭它。

我的问题是其中一个查询是可观察的查询。我只在订阅完成后关闭这个领域实例。同时,其他操作可以关闭其领域实例。我知道领域实例是从缓存中获得的,所以我认为其中一个操作正在关闭我在创建可观察查询时获得的同一个领域实例,因为在一些操作之后,我的可观察查询停止发出项目,并且当我完成我的订阅,我收到一个异常,说我的领域实例已经关闭。它有道理吗?怎样才能避免呢?

我认为这是正在发生的事情:

1. Start observable query -> Realm observable instance opened
2. Start database update 1 -> Realm query1 instance opened
3. Finish database update 1 -> Realm query1 instance closed

...

4. Start database update X -> Realm observable instace opened again <- PROBLEM
5. Finish database update X -> Realm observable instance closed
6. Finish observable query -> Realm observable instance closed again -> EXCEPTION

这是我执行可观察查询的代码:

Realm realm = Realm.getDefaultInstance();

return realm.where(Message.class)
        .findAll().asObservable()
        .filter(RealmResults::isLoaded)
        .map(realm::copyFromRealm)
        .doOnUnsubscribe(() -> realm.close());

有没有什么办法可以得到一个全新的没有缓存的领域实例,这样没有人可以得到引用并关闭它?

【问题讨论】:

  • 您是否考虑过发布真实代码而不是伪代码,以便人们真正看到您在做什么? :P
  • 我无法发布任何代码,对不起。我认为这个问题已经足够详细了。
  • I only close this realm instance when the subscription is finished. 我需要知道这是怎么做到的,因为这就是你搞砸的地方。
  • 好的,我已经用该代码更新了问题。非常感谢。

标签: android realm


【解决方案1】:

实际上,Realm 的 Rx 集成使用 RealmResults 的 RealmConfiguration 来增加 Realm 内部的引用计数(在 Observable 内部),因此您不需要这样做。你可以这样做:

try(Realm realm = realm.getDefaultInstance()) {
    return realm.where(Message.class)
        .findAll()
        .asObservable() // synchronous query is always loaded
        .map(realm::copyFromRealm)
}

它会起作用的。虽然我不确定它是否有助于解决您的问题。

【讨论】:

  • 感谢@EpicPandaForce,它不会解决主要问题,即当我执行realm.getDefaultInstance() 时在代码的其他部分使用相同的领域实例,然后关闭所以我的 observable 停止发射项目。
  • 你不应该像这样关闭 Observable,除非你在 Realm 的其他地方调用 close 两次
  • 是的,问题是当我使用 realm.getDefaultInstance() 获得领域实例时,同一个领域实例正在其他地方被关闭,正如我在问题中所描述的那样。
  • 我想你不明白我的意思。调用getDefaultInstance() 会增加引用计数。 close() 递减它。因此,除非您拨打close() 的次数超出预期,否则这不会发生。
  • 好的,我会看看是不是我做错了什么,非常感谢!
猜你喜欢
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多