В моих проектах Android я использую realm в качестве механизма хранения данных. Я люблю это!
Я также использую RxJava, потому что он делает "threading" намного проще, и мне очень нравится весь "реактивный образ мышления". Я люблю это!
Я использую шаблон MVP + некоторые идеи "чистой архитектуры" для создания моих приложений.
Мои Interactors
являются единственными, кто знает о Realm
. Я выставляю данные с помощью Observable, например:
@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 для этого варианта использования.
Мне действительно нравится использовать Realm + RxJava, но я не могу найти чистого решения для close
экземпляра Realm, когда я unsubscribe
(обычно я отказываюсь от подписки, когда действие уничтожается). Любые идеи?
Изменить 1: https://github.com/realm/realm-java/issues/2357
Изменить 2: благодаря очень активной команде realm, для исправления этой проблемы уже существует запрос на перенос.