我得到了这类错误:
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) {
...
});
}
});
}我自己不能再犯错误,但我可以在“破折号”中看到它经常出现。
发布于 2018-11-13 09:46:00
如果您有一个UI线程写入事务,并且有一个RealmChangeListener,在其中还执行一个异步查询(或addChangeListener),就会发生这种情况。
解决方案1:不要使用UI线程写入事务,因为它们可能会阻塞您的UI,并且您的应用程序会慢而坏
解决方案2:如果您在RealmChangeListener内部的写事务中,那么在handler.post {块中执行逻辑
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();
}
}
});
}https://stackoverflow.com/questions/53277341
复制相似问题