在我的Android项目中,我使用realm作为我的数据存储引擎。我喜欢它!
我也使用RxJava,因为它使得“线程化”变得更容易,而且我非常喜欢整个“反应性思维模式”。我喜欢它!
Realm,RxJava,asObservable()和doOnUnsubscribe()
我使用MVP模式+一些“清洁架构”的想法来构建我的应用程序。
我的Interactors
是唯一知道Realm
的人。我公开数据与可观察的帮助下,像这样:
@Override
public Observable<City> getHomeTown() {
final Realm realm = Realm.getDefaultInstance();
return realm.where(City.class).equalTo("name", "Cluj-Napoca").findAllAsync().asObservable()
.doOnUnsubscribe(new Action0() {
@Override
public void call() {
realm.close();
}
})
.compose(new NullIfNoRealmObject<City>());
}
问题是我的doOnUnsubscribe
副作用被Realm
之前调用可以做的事情,处理暴露观察到:
Caused by: java.lang.IllegalStateException: This Realm instance has already been closed, making it unusable.
at io.realm.BaseRealm.checkIfValid(BaseRealm.java:344)
at io.realm.RealmResults.removeChangeListener(RealmResults.java:818)
at io.realm.rx.RealmObservableFactory$3$2.call(RealmObservableFactory.java:137)
at rx.subscriptions.BooleanSubscription.unsubscribe(BooleanSubscription.java:71)
at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:124)
at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:113)
at rx.Subscriber.unsubscribe(Subscriber.java:98)
at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:124)
at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:113)
at rx.Subscriber.unsubscribe(Subscriber.java:98)
at rx.subscriptions.CompositeSubscription.unsubscribeFromAll(CompositeSubscription.java:150)
at rx.subscriptions.CompositeSubscription.unsubscribe(CompositeSubscription.java:139)
at ro.tudorluca.realm.sandbox.city.CityPresenter.onDestroy(CityPresenter.java:62)
at ro.tudorluca.realm.sandbox.city.CityActivity.onDestroy(CityActivity.java:35)
我创建本用例的sandbox项目。
我真的很喜欢使用领域+ RxJava,但我似乎无法找到一个干净的解决方案,以close
的领域实例时,我unsubscribe
(我平时活动时被破坏退订)。有任何想法吗?
编辑1:https://github.com/realm/realm-java/issues/2357
编辑2:多亏了非常积极的境界团队,已经有一个pull request来解决这个问题。
考虑通过Observable#使用包装Realm,这将简化您的getManagedRealm()方法:http://pastebin.com/CrzryvCq –
我尝试您的解决方案并遇到问题:在领域文件中打开太多 –