我正在尝试使用handler
因为我想要回到copyToRealmOrUpdate
的{{1}}。但是,当我尝试更新特定managed proxy
的{{1}}时,我正在List
List item
此Realm实例已关闭,使其无法使用
index
任何人都可以告诉我为什么使用这个error
我得到了tranlist.get(0).setExercise("New Exercise");
。
更新
现在我正在使用addChangeListener
List<transactiondata> updatedlist;
realm = Realm.getDefaultInstance();
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(final Realm bgRealm) {
tranlist = bgRealm.copyToRealmOrUpdate(updatedlist);
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
// Transaction was a success.
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(Throwable error) {
// Transaction failed and was automatically cancelled.
}
});
现在,当我尝试在特定位置更新managed proxy
时,error
realm_list = realm.where(transactiondata.class).findAllAsync();
realm_list.addChangeListener(new RealmChangeListener<RealmResults<transactiondata>>() {
@Override
public void onChange(RealmResults<transactiondata> transactiondata) {
tranlist = transactiondata;
}
});
答案 0 :(得分:1)
简单,
realm = Realm.getDefaultInstance();
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(final Realm bgRealm) {
tranlist = bgRealm.copyToRealmOrUpdate(tranlist); // <--
您正在尝试使用后台线程Realm直接从后台线程获取List。
打开Realm以执行事务,提交事务,然后关闭。因此,当您尝试访问UI线程上的列表时,后台线程Realm已经关闭。
考虑到您尝试将此列表中的托管RealmObjects传递给UI线程,即使Realm尚未关闭,您也会获得IllegalStateException: Realm access from incorrect thread. Managed RealmObjects can only be accessed on the thread where they were created
。
因此,您不应该尝试从后台线程获取托管代理列表,而应该定义查询并使用它来监听更改。
Realm realm;
RealmResults<transactiondata> results;
RealmChangeListener realmChangeListener = new RealmChangeListener() { ...
public void onCreate(Bundle bundle) {
...
results = realm.where(...).sort(...).findAllAsync();
results.addChangeListener(realmChangeListener);
}
public void onDestroy() {
...
results.removeAllChangeListeners();
results = null;
realm.close();
}
我刚刚注意到 - 如果你想修改对象的属性,那么如果它不是关闭的Realm和非法的线程访问,你还需要包装无论如何它都在写交易中。
final long id = tran.getId();
realm.executeTransactionAsync((bgRealm) -> {
transactiondata bgTran = bgRealm.where(transactiondata.class).equalTo("id", id).findFirst();
if(bgTran != null) {
bgTran.setExercise("New exercise");
}
});