gpt4 book ai didi

android - 如何正确访问服务中的 Realm 实例?

转载 作者:搜寻专家 更新时间:2023-11-01 09:43:32 26 4
gpt4 key购买 nike

我在访问用于处理 Socket.IO 连接的 Service 类中的 Realm 实例时遇到问题。我在像这样调用 onStartCommand 时得到一个 Realm 实例。

public class SocketService extends Service{
Realm realmInstance;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
realmInstance = Realm.getDefaultInstance();
}
}

问题是当我绑定(bind)到一个套接字事件时,在接收到该事件后我需要将一些数据存储到 Realm 但它抛出一个异常表明 Realm 对象可以' 在创建它的线程之外的线程中访问。

socket.on("register", new Emitter.Listener() {
@Override
public void call(Object... args) {
List<MyRealmObject> list = realmInstance.where(MyRealmObject.class).findAll();
}
});

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

我尝试为我的事件调用创建一个单独的实例,我在 socket.io 的 CONNECT 调用中实例化了它,但没有成功。

最佳答案

public int onStartCommand(Intent intent, int flags, int startId) { 在 UI 线程上运行。

public void call(Object... args) { 在后台线程上运行。

它们不是同一个线程。每个线程都需要自己的 Realm 实例(如果您在线程上访问 Realm)。在无法自动更新的后台线程上,您必须在不再需要时关闭 Realm 实例。

socket.on("register", new Emitter.Listener() {
@Override
public void call(Object... args) {
try(Realm realm = Realm.getDefaultInstance()) {
List<MyRealmObject> list = realm.where(MyRealmObject.class).findAll();
} // try-with-resources auto-close
}
});

关于android - 如何正确访问服务中的 Realm 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38810984/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com