Android 可观察查询的领域实例被另一个查询关闭

Android 可观察查询的领域实例被另一个查询关闭,android,realm,Android,Realm,我的领域实例有问题。我只使用领域默认实例。对于每个查询/更新操作,我都会获得一个带有realm.getDefaultInstance()的realm实例,并在完成该操作时将其关闭 我的问题是其中一个查询是可观察的查询。我仅在订阅完成时关闭此领域实例。同时,其他操作可以关闭其领域实例。我知道领域实例是从缓存中获取的,所以我认为其中一个操作正在关闭我创建可观察查询时获得的同一个领域实例,因为在一些操作之后,我的可观察查询停止显示项目,当我完成订阅时,我得到一个异常,说我的领域实例已经关闭。它有意义吗

我的领域实例有问题。我只使用领域默认实例。对于每个查询/更新操作,我都会获得一个带有realm.getDefaultInstance()的realm实例,并在完成该操作时将其关闭

我的问题是其中一个查询是可观察的查询。我仅在订阅完成时关闭此领域实例。同时,其他操作可以关闭其领域实例。我知道领域实例是从缓存中获取的,所以我认为其中一个操作正在关闭我创建可观察查询时获得的同一个领域实例,因为在一些操作之后,我的可观察查询停止显示项目,当我完成订阅时,我得到一个异常,说我的领域实例已经关闭。它有意义吗?如何避免这种情况

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

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


有没有办法获取一个全新的领域实例,而该实例没有被缓存,这样就没有人可以获取引用并关闭它?

事实上,领域的Rx集成使用RealmResults的RealmConfiguration在内部(在可观察对象内)增加领域引用计数,所以您不需要这样做。你可以做:

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

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

您是否考虑过发布真实代码而不是伪代码,以便人们能够真正看到您在做什么对不起,PI不能发布任何代码。但我认为问题已经足够详细了。
我只在订阅完成后关闭此领域实例。
我需要知道这是如何完成的,考虑到这正是你搞乱的地方。好的,我已经用该代码更新了问题。非常感谢。感谢@EpicPandaForce,它不会解决主要问题,即当我执行realm.getDefaultInstance()时,在代码的其他部分使用相同的领域实例,然后关闭,这样我的可观察对象就停止发射项目。除非在其他地方两次调用领域上的close,否则你不应该关闭这样的可观察对象。是的,问题是当我得到一个领域实例Realm.getDefaultInstance()时,同一领域实例在其他地方被关闭,正如我在问题中所描述的,我想你不明白我的意思。调用
getDefaultInstance()
会增加引用计数<代码>关闭()。因此,除非您调用
close()
的次数超出预期,否则这不会发生。好的,我会调查一下,看看我是否做错了什么,非常感谢!
Realm realm = Realm.getDefaultInstance();

return realm.where(Message.class)
        .findAll().asObservable()
        .filter(RealmResults::isLoaded)
        .map(realm::copyFromRealm)
        .doOnUnsubscribe(() -> realm.close());
try(Realm realm = realm.getDefaultInstance()) {
    return realm.where(Message.class)
        .findAll()
        .asObservable() // synchronous query is always loaded
        .map(realm::copyFromRealm)
}