首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >域在使用多个addChangeListeners时“不能创建异步查询”

域在使用多个addChangeListeners时“不能创建异步查询”
EN

Stack Overflow用户
提问于 2018-11-13 09:06:25
回答 1查看 1.4K关注 0票数 1

我得到了这类错误:

代码语言:javascript
复制
Fatal Exception: java.lang.IllegalStateException: Cannot create asynchronous query while in a write transaction in /Users/cm/Realm/realm-java/realm/realm-library/src/main/cpp/io_realm_internal_OsResults.cpp line 252
       at io.realm.internal.OsResults.nativeStartListening(OsResults.java)
       at io.realm.internal.OsResults.addListener(OsResults.java:405)
       at io.realm.internal.OsResults.addListener(OsResults.java:412)
       at io.realm.RealmResults.addChangeListener(RealmResults.java:173)
       at io.realm.internal.ObservableCollection$RealmChangeListenerWrapper.onChange(ObservableCollection.java:39)
       at io.realm.internal.ObservableCollection$CollectionObserverPair.onChange(ObservableCollection.java:20)
       at io.realm.internal.ObservableCollection$Callback.onCalled(ObservableCollection.java:64)
       at io.realm.internal.ObservableCollection$Callback.onCalled(ObservableCollection.java:54)
       at io.realm.internal.ObserverPairList.foreach(ObserverPairList.java:109)
       at io.realm.internal.OsResults.notifyChangeListeners(OsResults.java:451)
       at io.realm.internal.OsSharedRealm.nativeBeginTransaction(OsSharedRealm.java)
       at io.realm.internal.OsSharedRealm.beginTransaction(OsSharedRealm.java:269)
       at io.realm.BaseRealm.beginTransaction(BaseRealm.java:401)
       at io.realm.Realm.beginTransaction(Realm.java:146)

当我添加addChangeListeners时,如何确保我没有处于事务处理中?一个简单的mRealm.isInTransaction方法可以帮助还是问题是在代码结构?

代码语言:javascript
复制
public void update() {
    sData = dataQuery.sort(Data.ORDER, Sort.ASCENDING).findAllAsync();
    sData.addChangeListener(new RealmChangeListener<RealmResults<Data>>() {
        @Override
        public void onChange(RealmResults<Data> element) {
            sDiffData = mRealm.where(DiffData.class)
                    .greaterThanOrEqualTo(...)
                    .lessThan(...)
                    .equalTo(..)
                    .findAllAsync();
            sDiffData.addChangeListener(new RealmChangeListener<RealmResults<...>>() {
                @Override
                public void onChange(RealmResults<...> element) {
                    ...
            });
        }
    });
}

我自己不能再犯错误,但我可以在“破折号”中看到它经常出现。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-13 09:46:00

如果您有一个UI线程写入事务,并且有一个RealmChangeListener,在其中还执行一个异步查询(或addChangeListener),就会发生这种情况。

解决方案1:不要使用UI线程写入事务,因为它们可能会阻塞您的UI,并且您的应用程序会慢而坏

解决方案2:如果您在RealmChangeListener内部的写事务中,那么在handler.post {块中执行逻辑

代码语言:javascript
复制
private void fetchDiff() {
        sDiffData = mRealm.where(DiffData.class)
                .greaterThanOrEqualTo(...)
                .lessThan(...)
                .equalTo(..)
                .findAllAsync();
        sDiffData.addChangeListener(new RealmChangeListener<RealmResults<...>>() {
            @Override
            public void onChange(RealmResults<...> element) {
                ...
        });
}

public void update() {
    sData = dataQuery.sort(Data.ORDER, Sort.ASCENDING).findAllAsync();
    sData.addChangeListener(new RealmChangeListener<RealmResults<Data>>() {
        @Override
        public void onChange(RealmResults<Data> element) {
            Realm realm = element.getRealm();
            if(realm.isInTransaction()) {
                handler.post(() -> {
                    fetchDiff();
                });
            } else {
                fetchDiff();
            }
        }
    });
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53277341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档