多个Realm事务导致UI线程冻结

3

我正在从服务器检索数据作为JSON文件,然后尝试为每个活动创建一个 Realm 对象。

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个时,UI线程会冻结。如果我运行相同的代码两次,由于所有对象已经存在于Realm中,因此不会提交任何事务,因此代码不会冻结。如何避免UI线程冻结?


你的UI是否与Realm有任何交互?我特别想到写入事务。 - geisshirt
1个回答

1

在循环中不应执行写事务,因为每个事务都有相当数量的开销。这本身不应该阻塞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();
}

太棒了,这个运行得非常好。我现在遇到的唯一问题是,在syncRunData类中的onPostExecute运行之前,realm不包含新添加的对象。有没有办法解决这个问题? - Mukesh
没关系,我修改了我的onResponse函数使其正常工作。非常感谢! - Mukesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接