有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用rxjava和dagger2跨线程访问java领域

我读过很多关于这个话题的帖子,但我还是有点不清楚。我知道你不能跨不同的线程访问Realm类或领域对象,所以我想知道处理这个问题的最佳方法是什么

我有一个启动线程的服务。该线程执行后台工作(包括通过rxjavaSchedulers.io上执行的工作)。现在,在某一点上,我想将一些数据保存到DataManager类中的领域。最初,我使用Dagger2Realm注入到我的DataManager类中(该类本身被注入到服务中)。但是,这将不起作用,因为注入是在主线程上完成的,所以Realm.getDefaultInstance()绑定到主线程,但它是从另一个线程在DataManager中访问的

我能想到的唯一可行的选择是在执行事务的每个方法的开头和结尾调用Realm.getDefaultInstance()realm.close()。我不介意这样做,但我想知道每次我想保存一个对象时调用Realm.getDefaultInstance()是否会影响性能。有更好的方法吗?提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    在我的一个应用程序中使用Realm时,我通过创建DatabaseManager类解决了线程问题,我使用Dagger 2将该类注入到活动和服务中

    例如,如果我有一个实体Task,那么DatabaseManager类有一个方法void update(Task task),该方法将获取默认的领域实例,从领域数据库中获取具有给定ID的Task,更新事务块中获取的Task实例,执行realm.copyFromRealm(updatedTask);,并在方法结束时关闭领域实例

    Realm realm = Realm.getDefaultInstance();
            realm.executeTransaction(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
                    // fetch the object from Realm database and update it as required.
    
                    //https://realm.io/docs/java/latest/api/io/realm/Realm.html#copyFromRealm-E-
                    // Makes an unmanaged in-memory copy of an already persisted RealmObject.
                    realm.copyFromRealm(task);
    
                    }
                }
            });
    realm.close();
    

    这对我很管用。如果有更好的方法,我想知道更多