W moich projektach Android używam realm jako mojego silnika do przechowywania danych. Kocham to!
Używam również RxJava, ponieważ sprawia, że "gwintowanie" jest o wiele łatwiejsze i bardzo podoba mi się cały "reaktywny sposób myślenia". Kocham to!
Realm, RxJava, asObservable() i doOnUnsubscribe()
Używam wzorca MVP + trochę pomysłów "Czysta architektura" do budowania moich aplikacji.
Moje Interactors
to jedyne osoby, które wiedzą o Realm
. I narazić danych za pomocą Obserwowalne, tak:
@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>());
}
Problem jest mój doOnUnsubscribe
efektem ubocznym jest wywoływana przed Realm
może zrobić jego rzecz, obsługi odsłonięta obserwowalne:
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)
Stworzyłem projekt sandbox dla tego przypadku użycia.
Bardzo lubię używać Realm + RxJava, ale nie mogę znaleźć czystego rozwiązania dla close
instancji Realm, kiedy I unsubscribe
(zwykle rezygnuję z subskrypcji, gdy działanie zostanie zniszczone). Jakieś pomysły?
Edycja 1: https://github.com/realm/realm-java/issues/2357
Edycja 2: dzięki bardzo aktywnym zespołem realm, nie jest już pull request aby rozwiązać ten problem.
Rozważ pakowanie Realm przez Observable # przy użyciu, to uprości twoją metodę getManagedRealm(): http://pastebin.com/CrzryvCq –
Próbuję twoje rozwiązanie i stanąłem przed problemem: zbyt wiele otwartych w pliku –