我真的很难让Realm在异步任务上工作,到目前为止,我无法让它工作。
所以,这基本上就是我要做的事情:
private class saveOnRealmAsync extends AsyncTask<Void, Void, List<Transactions>> {
@Override
protected List<Transactions> doInBackground(Void... Void) {
//make a list of object to save on Realms
return listObjectToSave;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
showProgressDialog();
}
@Override
protected void onPostExecute(List<Transactions> listObjectToSave) {
super.onPostExecute(transactionsList);
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
realm.copyToRealmOrUpdate(listObjectToSave);
realm.commitTransaction();
realm.close();
hideProgressDialog();
activity.finish();
}
}
我有一个
“java.lang.IllegalStateException:非法状态:表格不再有效。”
on realm.copyToRealmOrUpdate(listObjectToSave);
当我在AsyncTask之外执行此操作时,它会起作用,但问题是,有时需要一些时间才能使我的列表对象准备好保存。
我做错了什么?
答案 0 :(得分:0)
您只能从创建它的线程访问域。 Asynctask在另一个线程上执行,因此它崩溃了。如果您想要异步保存,请使用异步事务
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm bgRealm) {
//save here
realm.copyToRealmOrUpdate(listObjectToSave);
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
//callback for success
}
});
查看this了解详情
答案 1 :(得分:0)
您的问题是您正在UI线程上写入Realm。你应该在后台线程上做到这一点。
private class saveOnRealmAsync extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... Void) {
//make a list of object to save on Realms
final fListObjectToSave = listObjectToSave;
Realm realm = null;
try {
realm = Realm.getDefaultInstance();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.copyToRealmOrUpdate(fListObjectToSave);
}
});
} finally {
if(realm != null) {
realm.close();
}
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
showProgressDialog();
}
@Override
protected void onPostExecute(Void void) {
hideProgressDialog();
activity.finish();
}
}