2016-08-19 88 views
0

我真的很難讓Realm在異步任務上工作,到目前爲止,我無法使其工作。Table不再有效,在AsyncTask上運行

所以,這基本上就是我想要做的事:

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:非法狀態:表不再有效操作。「

realm.copyToRealmOrUpdate(listObjectToSave);

它的工作原理,當我這樣做了的AsyncTask之外,但問題是,有些時候,它需要一定的時間,讓我的列表對象進行保存。

我在做什麼錯?

回答

0

你的問題是,你寫的UI線程上的境界。你應該在後臺線程上做到這一點。

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(); 
    } 
} 
+0

它的工作就是這樣。我有其他問題,但它與我試圖保存的對象有關,它使用其他Realm對象作爲字段,並設法使其工作。非常感謝! –

0

只能從創建它的線程訪問領域。 Asynctask在另一個線程上執行,所以它崩潰。如果你想節省asynchron使用異步交易,而不是

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更多信息

+0

但如果他關閉之前'OnSuccess'通過異步回調的事務叫做境界,那麼他會碰到的問題。 – EpicPandaForce

+0

是的領域需要關閉onSuccess –

+0

或也'在onError()' – EpicPandaForce