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

时间:2016-08-07 04:53:37

标签: android socket.io android-service realm

我在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调用中实例化无效。

1 个答案:

答案 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
        }
    });