如何在服务中正确访问Realm实例



我在访问用于处理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
        }
    });

最新更新