2016-11-21 16 views
-1

私は自分のデータベースとしてレルムを使用しています。そして、私は次のエラー私はforループ、ではなく、私は場所から呼び出されるAsyncTaskのonPostExecute方法でそれをやっている中でそれをやっておりません他の人とは違って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) 

を取得していたデータを更新/挿入しながらリスナを変更しました。どちらも他の場所で使われていません。

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はあなたのコード内のいくつかのproblensあり、ここで

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

親愛なるDownvoter、ダウンの場合、私の将来のミスを避けるために理由をコメントしてください。 – Salmaan

+0

addObjectToJSONArrayについての知識なし私は、 'tripJSON.toString()'が 'addObjectToJSONArray(location);'(これは99%modyfing 'tripJSON')と同時に呼び出されると確信しています – Selvin

+1

そしてdownvoteについて: (http://stackoverflow.com/help/how-to-ask)が役立つかもしれません... [this](http://stackoverflow.com/help/mcve) – Selvin

答えて

1

から呼び出されている:

1)あなたはJSONArray内のすべての値を格納する手段、それが試みること、 ALL PREVIOUSの値も重み付けしてください。配列が大きくなると、古いデータがまだ処理されている間に新しいデータが生成されます。つまりエラーの理由です。

2).onPostExecute()メソッドはメインスレッドで実行されるため、AsyncTaskの利点はありません。

3)AsyncTaskはそれに見て、同様の答えがあります廃止され、メインスレッドと同じproirityと同じスレッドプール(株)と

Writing realm from service class causing UI block

+0

AsyncTaskは時代遅れだと言われたので、代わりに何を使うべきですか? – Salmaan

+0

rxJavaライブラリ、答えのリンクを参照 –

+0

* AsyncTaskは廃止されました* ... **いいえ、それは**ではありません – Selvin

関連する問題