我的项目采用了清晰的架构。在这种情况下,UI层与域层是分离的。因此,我认为最好将UI层不与Realm实例相关联。由于Realm文档建议在Activity的生命周期中管理Realm实例,那么我应该如何处理Realm实例呢?
更明确地说,我的项目太重了,无法改变所有对象继承自
更明确地说,我的项目太重了,无法改变所有对象继承自
RealmObject
。因此,我使用独立的对象持久化数据。当API调用完成时,业务对象转换为Realm对象,反之亦然。我创建了以下方法:public void insert(T object){
final Realm realm = RealmProvider.getRealm();
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.copyToRealmOrUpdate(createRealmObject(object));
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
realm.close();
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(Throwable error) {
realm.close();
}
});
}
实际上,它运行良好。但是下面我不知道如何处理关闭领域实例。
public Observable<T> queryAsync(Condition<? extends RealmObject> condition) {
final Realm realm = RealmProvider.getRealm();
return condition.getQuery(realm).findFirstAsync()
.asObservable()
.filter(new Func1<RealmObject, Boolean>() {
@Override
public Boolean call(RealmObject realmObject) {
return realmObject.isLoaded();
}
})
.map(new Func1<RealmObject, T>() {
@Override
public T call(RealmObject realmObject) {
return createObjectFromRealm(realmObject);
}
});
}
call
是链中的最后一个函数,所以你可以在那里关闭领域,参见编辑。这可能有效。 - Timcall
中通过引用该循环器在“正常”线程上运行代码。 - Tim