小编典典

Android Realm-从服务访问Realm对象

java

我在活动中创建了一个领域对象。我需要能够在我创建的服务中访问该对象。但是在服务中创建Realm对象时出现错误

        mRealm = Realm.getInstance(getApplicationContext());

java.lang.IllegalStateException:来自错误线程的领域访问。只能在创建对象的线程上访问领域对象

现在我理解这意味着,因为领域对象是在我的活动上创建的,所以我无法从后台线程访问它。但是,除了创建自己的自定义处理程序线程外,我没有找到其他简便的方法,但这似乎是一个笨拙的方法。

我是否在这里缺少某些东西,还是真的没有更好的方法可以从不同线程访问Realm对象?

更新:

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


阅读 216

收藏
2020-11-19

共1个答案

小编典典

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

这是用法示例:

youRealmObject = realm.copyFromRealm(youRealmObject);

以下是来自docs的信息:

为已持久的RealmObject制作独立的内存中副本。这是一个深层副本,将复制所有引用的对象。复制的对象都已与Realm分离,因此将不再自动更新它们。这意味着复制的对象可能包含与其他托管Realm对象不再一致的数据。
警告
:对复制对象的任何更改都可以使用copyToRealmOrUpdate(RealmObject)合并回Realm,但是所有字段都将被覆盖,而不仅仅是已更改的字段。这包括对其他对象的引用,并且有可能覆盖其他线程所做的更改。

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

2020-11-19