他们在 onCreate 中实例化一个领域实例并在活动的 onDestroy 中关闭它
这是针对 UI 线程 Realm 的。
将其注入本地数据源
您收到的Realm 实例是线程本地引用计数实例,而不是“线程安全”单例。所以你可能不应该直接注入Realm,因为那样它将被限制在一个给定的线程中。
一般UI线程Realm可以由ViewModel、retained fragment、onCreate()/onDestroy()等来管理,因为Realm只有在RealmResults有效时才提供通知,这意味着Realm实例是打开的。
因此,要在任何线程上公开 RealmResults,不知道它是 RealmResults 的事实,您需要这样做
public Flowable<List<ChatsModel>> getAllChatsData(Realm realm) {
RealmQuery<ChatsModel> query = realm.where(ChatsModel.class);
if(realm.isAutoRefresh()) {
return query.findAllAsync().asFlowable().filter(RealmResults::isLoaded);
} else {
return Flowable.just(query.findAll());
}
}
如您所见,它接收Realm 实例作为其输入。现在,如果您想删除该参数,则需要在从本地数据源公开的任何内容中隐藏引用计数,我个人认为 LiveData 是最好的选择 - 因为它有 @987654330 @/onInactive() 回调。
public class RealmLiveData<T extends RealmModel> extends MutableLiveData<List<T>> {
public interface QueryDefinition<M extends RealmModel> {
RealmResults<M> createResults(Realm realm);
}
private final QueryDefinition<T> queryDefinition;
public RealmLiveData(QueryDefinition<T> query) {
this.queryDefinition = query;
// TODO: handle realm config other than DefaultConfig if needed
}
Realm realm;
RealmResults<T> results;
RealmChangeListener<RealmResults<T>> realmChangeListener = new RealmChangeListener<RealmResults<T>>() {
@Override
public void onChange(RealmResults<T> results) {
if(results.isLoaded()) {
setValue(results);
}
}
}
@Override
public void onActive() {
realm = Realm.getDefaultInstance();
results = queryDefinition.createResults(realm);
results.addChangeListener(realmChangeListener);
}
@Override
public void onInactive() {
setValue(Collections.emptyList());
results.removeChangeListener(realmChangeListener);
realm.close();
realm = null;
}
}
然后你可以公开一个 LiveData:
public class MyDao {
public LiveData<List<MyObject>> findMyObjectsWithChanges() {
return new RealmLiveData<MyObject>(new QueryDefinition<MyObject>() {
@Override
public RealmResults<MyObject> createResults(Realm realm) {
return realm.where(MyObject).findAllAsync();
}
});
}
}
Lambda 表达式让它变得更好
public class MyDao {
public LiveData<List<MyObject>> findMyObjectsWithChanges() {
return new RealmLiveData<MyObject>((realm) -> realm.where(MyObject.class).findAllAsync());
}
}
所以这是一个值得研究的可能性。