在AsyncTask

时间:2016-08-19 13:45:37

标签: android realm

我真的很难让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之外执行此操作时,它会起作用,但问题是,有时需要一些时间才能使我的列表对象准备好保存。

我做错了什么?

2 个答案:

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