如何正确访问服务中的 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
        }
    });