【问题标题】:How can I save a Realm object inside an IntentService?如何在 IntentService 中保存 Realm 对象?
【发布时间】:2015-11-17 16:48:11
【问题描述】:

当我尝试将 Realm 对象保存在 IntentService 中时,出现以下异常。我的猜测是服务在 Realm 保存实际发生之前被杀死,但我不确定如何解决这个问题?

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.

【问题讨论】:

  • 您使用的是哪个 Realm 版本?
  • 我猜问题是你在其他线程中创建了 Realm 实例,但在线程退出时没有关闭它。 Realm 将在线程中创建 Realm 实例时在内部记录处理程序,并在调用 Realm.close() 时删除处理程序。当commitTransaction 被调用时,Realm 将向每个线程的处理程序发送消息,该处理程序创建了一个 Realm 实例。

标签: realm android-intentservice


【解决方案1】:

我认为这里的问题在于由 IntentService 管理的不同线程。系统将使用与该线程关联的 Handler,特别是如果您还尝试处理一些 UI(如 Toast、向活动发送数据、片段等......)

要解决这个问题,您可以尝试以这种方式打开领域:

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

设置

realm.setAutoRefresh(false);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多