我在Service
类中访问Realm实例时遇到问题,我正在用它来处理Socket.IO
连接。我在这样的Realm
电话上收到onStartCommand
个实例。
public class SocketService extends Service{
Realm realmInstance;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
realmInstance = Realm.getDefaultInstance();
}
}
问题是当我绑定到套接字事件时,在收到该事件后,我需要将一些数据存储到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。 Realm对象只能在创建它们的线程上访问
我尝试为我的事件调用创建一个单独的实例,我在socket.io的CONNECT
调用中实例化无效。
答案 0 :(得分:2)
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
}
});