2014-12-23 2 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), 실 13101 (com.lifestyle)에서 치명적인 신호 (11) (SIGSEGV) – Dinu

+0

는 단지 그 정보를 사용할 수 있습니까? 더 깊은 스택 추적은 없습니까? – bmunk

답변

0

는 위의 코드에서 버그가 있습니다. beginTransaction()에는 일치하는 commitTransaction()이 있어야하며 반대의 경우도 마찬가지입니다. 이를 보장하려면 executeTransaction()을 사용하는 것이 좋습니다. 따라서 루프 내에서 beginTransaction()을 이동하거나 루프 외부에서 commitTransaction()을 이동해야합니다. 그것은 당신의 기억 문제가 비록 완전히 명확하지 않다.

+0

실제로 커밋은 루프를 벗어난 ..하지만 여전히 나는 영역 인스턴스를 닫으려고이 오류 – Dinu

+0

메신저하지만이 확실히 최신 버전의 영역 인스턴스 – Dinu

+0

에 사용할 수있는 가까운 방법을지고 있다고하면에 "가까운()"방법이다 getInstance()에서 반환 된 영역 인스턴스입니다. 최신 버전을 사용하고 있습니까? – bmunk

0
당신은 확실히 realm.close 호출하여 영역 인스턴스를 닫아야합니다

()

당신이에 업데이트 알림 메시지를 전송 한 Realm.io 버그에서 발견 한 것보다 당신이 여러 스레드에 영역을 사용하는 경우 dead threads/Realms.

가까이() 메소드에이 코드를 추가하여 버전 0.76.0 고정되었다 : 최신 버전 날 위해 동일한 오류 수정

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

업데이트하기.

당신은 모든 Realm.getInstance()와 realm.close()을 추적 할 필요가 - 그들은 각 스레드에 대한 시간의 정확히 같은 수라고 할 수있다. 왕국 객체 자체의 getInstance 호출 스레드 당 하나, 비록()는 REF 하나 카운터 및 닫기()의 하나 REF 카운터를 감소으로 반복. 심판 카운터가 스택 추적을 게시하시기 바랍니다 0