如何正确访问服务中的 Realm 实例?
How to properly access Realm instance in a Service?
我在访问 Service
class 中的 Realm 实例时遇到问题,我正在使用它来处理 Socket.IO
连接。我在这样的 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.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
}
});
我在访问 Service
class 中的 Realm 实例时遇到问题,我正在使用它来处理 Socket.IO
连接。我在这样的 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.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
}
});