使用领域的内存异常

时间:2014-12-23 04:46:48

标签: android realm

我匿名获取内存异常,我不知道哪个代码块导致它。但我从领域知道它。是因为我使用单个插入而不是批量插入。

realm.beginTransaction();
summary = realm.createObject(ActivitySummary.class);
JSONObject activity = activities.getJSONObject(i);
JSONArray datas;
summary.setActID(activity.getInt("actID"));
summary.setActName(activity.getString("actName"));
summary.setSourceID(activity.getString("sourceID"));
datas = activity.getJSONArray("data");
for (int j = 0; j < datas.length(); j++) {
    JSONObject data = datas.getJSONObject(j);
    Date endTime = !data.getString("endTime").equals("null") ? new Date(data.getLong("endTime")) : new Date();
    summary.setEndTime(endTime);
    summary.setLogID(data.getString("logID"));
    summary.setDate(data.getInt("date"));
    summary.setStartTime(!data.getString("endTime").equals("null") ? new Date(data.getLong("startTime")) : new Date());
    summary.setValue(data.getString("value1"));
    summary.setValue2(data.getString("value2"));
    realm.commitTransaction();
}

例外12-23 10:40:10.302: A/libc(13101): Fatal signal 11 (SIGSEGV) at 0xd1d1d1cd (code=1), thread 13101 (com.lifestyle) –

2 个答案:

答案 0 :(得分:0)

上述代码中存在错误。 beginTransaction()必须具有匹配的commitTransaction(),反之亦然。建议使用executeTransaction()来确保这一点。所以你要么必须在循环内移动beginTransaction(),要么在循环外移动commitTransaction()。但是,如果这是你的记忆问题,那还不完全清楚。

答案 1 :(得分:0)

您肯定需要通过调用realm.close()

来关闭您的Realm实例

如果您在多个线程上使用Realm,那么您可能偶然发现Realm.io错误,它正在向死线程/领域发送更新通知消息。

通过在close()方法中添加这段代码,它已在版本0.76.0中得到修复:

if (handler != null) {
    handlers.remove(handler);
}

更新到最新版本为我修复了同样的错误。

您需要跟踪所有Realm.getInstance()和realm.close() - 它们必须为每个线程调用完全相同的次数。即使Realm对象本身每个线程只有一个,调用getInstance()会将它的ref计数器迭代一次,而close()将ref计数器减一。当ref计数器变为0时,Realm将被解雇。