使用多个addChangeListener时的领域“无法创建异步查询”

时间:2018-11-13 09:06:25

标签: android realm

我遇到这种类型的错误:

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的简单方法可能会有所帮助,或者问题出在代码结构上?

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) {
                    ...
            });
        }
    });
}

我自己无法重现错误,但我可以在crashlytics中经常看到该错误。

1 个答案:

答案 0 :(得分:2)

如果您具有 UI线程写事务,并且还具有一个SELECT * FROM YourTable,您还可以在其中执行异步查询(或RealmChangeListener),则会发生这种情况。

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

解决方案2:如果您正在RealmChangeListener内进行写事务,则在addChangeListener块中执行逻辑

handler.post {