2014-12-23 4 views
0

Я получаю исключение памяти анонимно, я не знаю, какой блок кода вызывает его. но я знаю его из царства. Это потому, что я использую одну вставку вместо объемной вставки.Исключение памяти с использованием 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) –

+0

Просьба отправить трассировку стека. – Emmanuel

+0

12-23 10: 40: 10.302: A/libc (13101): фатальный сигнал 11 (SIGSEGV) в 0xd1d1d1cd (код = 1), поток 13101 (com.lifestyle) – Dinu

+0

Это единственная доступная информация? Нет более глубокой стека? – bmunk

ответ

0

Существует ошибка в коде выше. В beginTransaction() должен быть сопоставлен commitTransaction() и наоборот. Для обеспечения этого рекомендуется использовать executeTransaction(). Таким образом, вам нужно либо переместить beginTransaction() внутри цикла, либо commitTransaction() вне цикла. Это не совсем ясно, если это ваша проблема с памятью.

+0

на самом деле коммит был за пределами цикла .. но все же я получал эту ошибку – Dinu

+0

im пытается закрыть экземпляр области, но не существует близкого метода, доступного для экземпляра realm – Dinu

+0

В последней версии, безусловно, есть метод close() на экземпляр realm возвращается из getInstance(). Используете ли вы последнюю версию? – bmunk

0

Вы, безусловно, необходимо закрыть экземпляры Realm по телефону realm.close()

Если вы используете Сферу на несколько потоков, чем вы могли наткнуться на Realm.io ошибка, где он отправлял сообщения уведомления об обновлении мертвые нити/царства.

Она была исправлена ​​в версии 0.76.0, добавляя этот кусок кода в тесном() метод:

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

Обновление до новейшей версии устранили эту же ошибку для меня.

Вам необходимо отслеживать все ваши Realm.getInstance() и realm.close() - их нужно вызывать ровно столько же раз для каждого потока. Несмотря на то, что сам объект Realm является только одним потоком, вызов getInstance() выполняет итерацию ref ref на единицу, а close() уменьшает счетчик ref на единицу. Царство будет уволено, когда счетчик ссылок будет равен 0.

Смежные вопросы