2016-06-20 103 views
1

我正在从服务器检索数据作为JSON文件,然后尝试为每个活动创建一个Realm对象。导致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(); 
} 

该代码在实例化为android AsyncTask的新线程中运行。

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

用户界面线程冻结少于70个活动。如果我运行了两次,则相同的代码不会冻结,因为Realm中已存在所有对象,因此不提交事务。我怎样才能避免冻结UI线程?

+0

你的UI是否对你的Realm做了什么?我特别想写写交易。 – 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

真棒,这真的很好。我现在唯一遇到的问题是,在syncPunData类中运行onPostExecute之前,领域不包含新添加的对象。有没有办法解决这个问题? – Mukesh

+0

没关系,我修改了我的onResponse函数使其工作。非常感谢你! – Mukesh