2014-12-23 39 views
0

我收到内存异常匿名,我不知道哪个代码块导致它。但我知道它来自于领域。是因为我使用单个插入而不是批量插入。使用领域的内存异常

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) –

+0

请发布堆栈跟踪。 – Emmanuel

+0

12-23 10:40:10.302:A/libc(13101):0xd1d1d1cd(代码= 1)的致命信号11(SIGSEGV),线程13101(com.lifestyle) – Dinu

+0

这是唯一可用的信息吗?没有更深层次的追踪? – bmunk

回答

0

有在上面的代码中的错误。 beginTransaction()必须有一个匹配的commitTransaction(),反之亦然。建议使用executeTransaction()来确保。所以你必须在循环内部移动beginTransaction()或者在循环外部移动commitTransaction()。尽管这是你的记忆问题,但并不完全清楚。

+0

实际上提交是在循环之外..但我仍然得到这个错误 – Dinu

+0

即时尝试关闭领域实例,但没有关闭方法可用于领域实例 – Dinu

+0

在最新版本肯定有一个“close()”方法从getInstance()返回的领域实例。你使用的是最新版本吗? – bmunk

0

你一定需要通过调用realm.close关闭您的领域实例()

如果您使用的是多线程的境界,可能比你有Realm.io错误,这错误是发送更新通知消息绊倒死亡线程/领域。

它是由在close()方法将这段代码固定在0.76.0版:

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

更新到最新版本的固定此相同的错误我。

您需要跟踪所有Realm.getInstance()和realm.close() - 必须为每个线程调用完全相同的次数。尽管Realm对象本身每个线程只有一个,但调用getInstance()会将ref计数器加1,而close()将ref计数器减1。当参考计数器达到0时,领域将被解雇。