Realm copyToRealmOrUpdate托管代理提供错误"此Realm实例已关闭,使其无法使用"?

时间:2018-02-05 13:07:16

标签: android realm

我正在尝试使用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;
        }
    });

1 个答案:

答案 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");
    }
});