我有一个在我的活动中创建的领域对象.我需要能够在我创建的服务中访问此对象.但是,我在服务中创建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对象?
更新:
我进一步深入研究,在IntentService中,onHandleIntent方法在一个单独的线程中运行,而不是在类中的其他方法.因此,我无法创建类级别的Realm实例,并且能够与onHandleIntent方法的内部和外部进行交互.这就是造成线程异常的原因.除了在每个方法中创建一个单独的Realm实例,我需要访问该对象并一遍又一遍地检索它,我认为Ilya Tretyakov的答案将是最好的.我可以在构造函数中从域中复制对象,然后在服务的整个生命周期中使用它.任何需要写回Realm对象的方法都需要在该方法中实例化自己的Realm实例.
解决方法:
您可以尝试使用realm.copyFromRealm(youRealmObject);.这些方法将Realm数据复制到普通的Java对象中,并将它们从Realm中分离出来.
以下是使用示例:
youRealmObject = realm.copyFromRealm(youRealmObject);
以下是来自docs的相关信息:
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-