2015-11-17 2 views
1

Я получаю следующее исключение, когда пытаюсь сохранить объект Realm внутри IntentService. Я предполагаю, что Служба убита до того, как спасение Realm действительно произойдет, но я не уверен, как это исправить?Как сохранить объект Realm внутри IntentService?

11-17 10:44:12.823 30368-11042/com.weightbook W/MessageQueue: Handler (android.os.Handler) {febe2b0} sending message to a Handler on a dead thread 
11-17 10:44:12.823 30368-11042/com.weightbook W/MessageQueue: java.lang.IllegalStateException: Handler (android.os.Handler) {febe2b0} sending message to a Handler on a dead thread 
11-17 10:44:12.823 30368-11042/com.weightbook W/MessageQueue:  at android.os.MessageQueue.enqueueMessage(MessageQueue.java:543) 
11-17 10:44:12.823 30368-11042/com.weightbook W/MessageQueue:  at android.os.Handler.enqueueMessage(Handler.java:631) 
11-17 10:44:12.823 30368-11042/com.weightbook W/MessageQueue:  at android.os.Handler.sendMessageAtTime(Handler.java:600) 
11-17 10:44:12.823 30368-11042/com.weightbook W/MessageQueue:  at android.os.Handler.sendMessageDelayed(Handler.java:570) 
11-17 10:44:12.823 30368-11042/com.weightbook W/MessageQueue:  at android.os.Handler.sendEmptyMessageDelayed(Handler.java:534) 
11-17 10:44:12.823 30368-11042/com.weightbook W/MessageQueue:  at android.os.Handler.sendEmptyMessage(Handler.java:519) 
11-17 10:44:12.823 30368-11042/com.weightbook W/MessageQueue:  at io.realm.BaseRealm.commitTransaction(BaseRealm.java:330) 
11-17 10:44:12.823 30368-11042/com.weightbook W/MessageQueue:  at io.realm.Realm.commitTransaction(Realm.java:113) 
11-17 10:44:12.823 30368-11042/com.weightbook W/MessageQueue:  at io.realm.Realm.executeTransaction(Realm.java:1038) 
11-17 10:44:12.823 30368-11042/com.weightbook W/MessageQueue:  at com.weightbook.database.manager.DataRecordManager.saveDataRecord(DataRecordManager.java:14) 
11-17 10:44:12.823 30368-11042/com.weightbook W/MessageQueue:  at com.weightbook.sync.DataRecordUtils.updateDataRecordIndexes(DataRecordUtils.java:42) 
11-17 10:44:12.823 30368-11042/com.weightbook W/MessageQueue:  at com.weightbook.service.ListeningToWearService.onDataChanged(ListeningToWearService.java:164) 
11-17 10:44:12.823 30368-11042/com.weightbook W/MessageQueue:  at com.google.android.gms.wearable.WearableListenerService$zza$1.run(Unknown Source) 
11-17 10:44:12.823 30368-11042/com.weightbook W/MessageQueue:  at android.os.Handler.handleCallback(Handler.java:739) 
11-17 10:44:12.823 30368-11042/com.weightbook W/MessageQueue:  at android.os.Handler.dispatchMessage(Handler.java:95) 
11-17 10:44:12.823 30368-11042/com.weightbook W/MessageQueue:  at android.os.Looper.loop(Looper.java:148) 
11-17 10:44:12.823 30368-11042/com.weightbook W/MessageQueue:  at android.os.HandlerThread.run(HandlerThread.java:61) 
11-17 10:44:12.823 30368-11042/com.weightbook W/REALM: Cannot update Looper threads when the Looper has quit. Use realm.setAutoRefresh(false) to prevent this. 
+0

Какую версию Realm вы используете? – beeender

+0

v 0.84.1. спасибо – Kamilski81

+0

Я думаю, проблема в том, что вы создали экземпляр Realm в других потоках, но не закрывали его при выходе из потока. Realm будет записывать обработчик внутри, когда экземпляр Realm создается в потоке и удаляет обработчик при вызове 'Realm.close()'. Когда 'commitTransaction' вызывается, Realm отправит сообщение каждому обработчику потока, который создал экземпляр Realm. – beeender

ответ

1

Я считаю, что проблема здесь в другом потоке, которым управляет IntentService. Система будет использовать обработчик, связанный с этим потоком, особенно если вы также пытаетесь обрабатывать некоторый пользовательский интерфейс (например, Toast, отправляя данные на активность, фрагмент и т. Д.)

Чтобы решить эту проблему, вы можете попробовать открыть область таким образом:

Realm realm = Realm.getInstance(getApplicationContext()); 

и установить

realm.setAutoRefresh(false); 
Смежные вопросы