2016-11-21 55 views
-1

我使用Realm作爲我的數據庫。雖然插入/更新數據我收到以下錯誤併發修改異常在onPostExecute方法中寫入領域 - Android

FATAL EXCEPTION: main 
Process: uk.org.humanfocus.hfi, PID: 6430 
java.util.ConcurrentModificationException 
at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573) 
    at org.json.JSONArray.writeTo(JSONArray.java:612) 
    at org.json.JSONStringer.value(JSONStringer.java:233) 
    at org.json.JSONObject.writeTo(JSONObject.java:720) 
    at org.json.JSONObject.toString(JSONObject.java:689) 
    at uk.org.humanfocus.hfi.DriverBehavior.DriverBehaviorMap$InsertCarProbeData.onPostExecute(DriverBehaviorMap.java:252) 
    at uk.org.humanfocus.hfi.DriverBehavior.DriverBehaviorMap$InsertCarProbeData.onPostExecute(DriverBehaviorMap.java:229) 
    at android.os.AsyncTask.finish(AsyncTask.java:651) 
    at android.os.AsyncTask.-wrap1(AsyncTask.java) 
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5443) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 

不像其他人我沒有做它在for循環,代替我做它的AsyncTask的onPostExecute方法是從位置稱爲改變了聽衆。它們也不在別的地方使用。

private class InsertCarProbeData extends AsyncTask<Void, Void, Void> { 

    Location location; 

    public InsertCarProbeData(Location location) { 
     this.location = location; 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      addObjectToJSONArray(location); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 

     realm.beginTransaction(); 
     trip.json = tripJSON.toString(); 
     realm.commitTransaction(); 
    } 
} 

這的AsyncTask被從這裏叫

new InsertCarProbeData(location).execute(); 
+0

親愛Downvoter,在下降的情況下,投票請評論原因,以便將來避免我的錯誤。 – Salmaan

+0

如果沒有關於addObjectToJSONArray的知識,我敢打賭''tripJSON.toString()'與addObjectToJSONArray(location);'(它在99%執行'tripJSON'的同時被調用) – Selvin

+1

關於downvote:我敢打賭[this] (http://stackoverflow.com/help/how-to-ask)可能會幫助...和[this](http://stackoverflow.com/help/mcve) – Selvin

回答

1

。在你的代碼的幾個問題之:

1)你店內JSONArray所有值,這意味着,它會嘗試超過所有以前的值。當數組變大時,新的數據排列,而舊值仍在處理 - 這是錯誤的原因

2).onPostExecute()方法在主線程上執行,所以通過這樣做,你沒有AsyncTask的好處。

3)的AsyncTask是過時的,是共享相同的線程池(具有相同的proirity,作爲主線程)

有類似的答案,看看它:Writing realm from service class causing UI block

+0

正如你所說的AsyncTask已經過時,應該用什麼來代替? – Salmaan

+0

rxJava庫,請參閱答案中的鏈接 –

+0

* AsyncTask已過時* ... **否,它不是** – Selvin