我在访问用于处理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();
}
}
问题是,当我绑定到套接字事件时,在接收到该事件时,我需要将一些数据存储到Realm
中,但它抛出了一个异常,表明Realm
对象不能在创建它的线程之外的其他线程中访问。
socket.on("register", new Emitter.Listener() {
@Override
public void call(Object... args) {
List<MyRealmObject> list = realmInstance.where(MyRealmObject.class).findAll();
}
});
java.lang.IollegalStateException:来自错误线程的领域访问。Realm对象只能在创建的线程上访问
我尝试为我的事件调用创建一个单独的实例,我在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
}
});