2014-12-23 40 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時,領域將被解僱。