2016-06-20 2 views
1

서버에서 JSON 파일로 데이터를 검색하고 각 작업에 대해 영역 개체를 만들려고합니다.UI 스레드가 멈추는 여러 영역 트랜잭션

public void onResponse(JSONObject response) { 
try { 
    JSONArray activities = response.getJSONArray("activities"); 
    Realm realm = Realm.getDefaultInstance(); 
    int numOfActivities = activities.length(); 
    for(int i = 0; i < numOfActivities; i++) { 
     JSONObject activity = activities.getJSONObject(i); 
     realm.beginTransaction(); 
     RunSummaryObject curr = realm.createObject(RunSummaryObject.class); 
     try { 
      curr.setId(activity.getLong("id")); 
      realm.commitTransaction(); 
     } catch (io.realm.exceptions.RealmPrimaryKeyConstraintException e) { 
      realm.cancelTransaction(); 
     } 
    } 
    realm.close(); 
} catch (JSONException e) { 
    e.printStackTrace(); 
} 

코드는 안드로이드 AsyncTask로 인스턴스화 된 새 스레드 내에서 실행됩니다.

private class syncRunData extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void... voids) { 
     downloadRunData(); 
     return null; 
    } 
} 

70 개 미만의 활동으로 UI 스레드가 중단되었습니다. 트랜잭션이 커밋되지 않도록 모든 객체가 이미 영역에 있으므로 두 번 실행하면 동일한 코드가 고정되지 않습니다. UI 스레드가 멈추는 것을 피하려면 어떻게해야합니까?

+0

UI가 귀하의 영역에서 어떤 작업을 수행합니까? 나는 특히 쓰기 거래에 대해 생각하고 있습니다. – geisshirt

답변

0

트랜잭션 당 오버 헤드가 거의 없으므로 루프 내에서 쓰기 트랜잭션을 수행하지 않아야합니다. 자체적으로 이것이 UI 스레드를 차단해서는 안되지만, UI 스레드에 알림 청취자가 있으면 70 번 호출하게되어 잠재적으로 문제를 일으킬 수 있습니다. 다음과 같은 내용이 훨씬 더 잘 수행됩니다.

public void onResponse(JSONObject response) { 
try { 
    JSONArray activities = response.getJSONArray("activities"); 
    Realm realm = Realm.getDefaultInstance(); 
    realm.beginTransaction(); 
    int numOfActivities = activities.length(); 
    for(int i = 0; i < numOfActivities; i++) { 
     JSONObject activity = activities.getJSONObject(i); 
     long id = activity.getLong("id"); 
     if (realm.where(RunSummaryObject.class).equalTo("id", long).findFirst() == null) { 
      RunSummaryObject curr = realm.createObject(RunSummaryObject.class); 
      curr.setId(activity.getLong("id")); 
     } 
    } 
    realm.commitTransaction(); 
    realm.close(); 
} catch (JSONException e) { 
    e.printStackTrace(); 
} 
+0

굉장히 잘 작동합니다. 지금 겪고있는 유일한 문제는 syncRunData 클래스에서 onPostExecute가 실행되기 전에 영역에 새로 추가 된 객체가 포함되어 있지 않다는 것입니다. 이 문제를 해결할 방법이 있습니까? – Mukesh

+0

신경 쓰지 마라. onResponse 함수를 수정했다. 고마워요! – Mukesh

관련 문제