В моих проектах для Android я использую realm в качестве механизма хранения данных. Я люблю это!
Я также использую RxJava, потому что это упрощает «нарезку», и мне очень нравится весь «реактивный образ мышления». Я люблю это!
Realm, RxJava, asObservable() и doOnUnsubscribe()
Я использую шаблон 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)
Я создал a sandbox проект для этого варианта использования.
Мне очень нравится использовать Realm + RxJava, но я не могу найти чистого решения для close
экземпляра Realm, когда я unsubscribe
(Обычно я отключаюсь, когда действие уничтожается). Есть идеи?
Edit 1: https://github.com/realm/realm-java/issues/2357
Edit 2: благодаря очень активной команде царств, есть уже pull request, чтобы решить эту проблему.
Рассмотрите обертывание Realm через Observable # using, это упростит ваш метод getManagedRealm(): http://pastebin.com/CrzryvCq –
Я пробую ваше решение, и у меня возникла проблема: слишком много открытых в файле realm –