我遇到这种类型的错误:
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中经常看到该错误。
答案 0 :(得分:2)
如果您具有 UI线程写事务,并且还具有一个SELECT * FROM YourTable
,您还可以在其中执行异步查询(或RealmChangeListener
),则会发生这种情况。
解决方案1:不要使用UI线程写事务,因为它们可能会阻塞您的UI,并且您的应用程序会很慢而且很糟糕
解决方案2:如果您正在RealmChangeListener内进行写事务,则在addChangeListener
块中执行逻辑
handler.post {