java - Android Realm - 从服务访问 Realm 对象

标签 java android multithreading realm

我有一个在我的 Activity 中创建的 Realm 对象。我需要能够在我创建的服务中访问此对象。但是,在服务中创建 Realm 对象时出现错误

        mRealm = Realm.getInstance(getApplicationContext());

java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created

现在我明白这意味着因为 Realm 对象是在我的 Activity 中创建的,所以我无法从后台线程访问它。但是,除了创建我自己的自定义处理程序线程之外,我没有找到解决此问题的简单方法,但这似乎是一种笨拙的方法。

我是不是遗漏了什么,或者真的没有更好的方法可以从不同的线程中访问 Realm 对象吗?

更新:

我进行了更深入的研究,发现在 IntentService 中,onHandleIntent 方法与类中的其他方法相比在单独的线程中运行。因此,我无法创建类级别的 Realm 实例,也无法与 onHandleIntent 方法内外的实例进行交互。这就是导致线程异常的原因。除了在每个方法中创建一个单独的 Realm 实例之外,我需要访问该对象并一遍又一遍地检索它,我认为 Ilya Tretyakov 的答案是最好的。我可以在我的构造函数中从 Realm 复制对象,然后在服务的整个生命周期中使用它。任何需要写回 Realm 对象的方法都需要在该方法中实例化它们自己的 Realm 实例。

最佳答案

您可以尝试使用realm.copyFromRealm(youRealmObject);。这些方法将 Realm 数据复制到普通的 Java 对象中,并将它们从 Realm 中分离出来。

这是一个用法示例:

youRealmObject = realm.copyFromRealm(youRealmObject);

这是文档中关于它的信息:

Makes a standalone in-memory copy of an already persisted RealmObject. This is a deep copy that will copy all referenced objects. The copied object(s) are all detached from Realm so they will no longer be automatically updated. This means that the copied objects might contain data that are no longer consistent with other managed Realm objects. WARNING: Any changes to copied objects can be merged back into Realm using copyToRealmOrUpdate(RealmObject), but all fields will be overridden, not just those that were changed. This includes references to other objects, and can potentially override changes made by other threads.

https://realm.io/docs/java/latest/api/io/realm/Realm.html#copyFromRealm-E-

关于java - Android Realm - 从服务访问 Realm 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35492039/

相关文章:

java - Android:使用一个套接字连接跨所有 Activity

java - 适当使用Java中的Multi-level Break

java - Jboss 7 是否支持来自远程客户端的远程 jndi 查找

Android获取联系人姓名和号码查询

iphone - 工作线程 iOS

c++ - 以线程安全的方式设置带有回调的类成员

java - 为什么用 Golang 写的一些函数运行起来比用 Java 还要慢?

android - 适用于 Android 的垂直操作栏

android - ScrollView 的滚动有监听器吗?

c# - 在事件分派(dispatch)之前检查 null ...线程安全吗?