Zu allererst machen i Reich Instanz von Repository-Klasse verwalten:Diese Realm Instanz bereits geschlossen wurde, ist es unbrauchbar + RxJava
public class RealmRepository {
private Lock lock;
protected RealmRepository() {
lock = new ReentrantLock();
}
public <T> T execute(Executor<T> executor) {
Realm realm = null;
try {
lock.lock();
realm = Realm.getDefaultInstance();
return executor.execute(realm);
} finally {
if (realm != null && !realm.isClosed()) {
realm.close();
}
lock.unlock();
}
}
public interface Executor<T> {
T execute(Realm realm);
}
}
Und die einzige Klasse, die von diesem RealmRepository erstreckt, dies ist mein Controller-Klasse ist. Problem ist, wenn ich zum ersten Mal Methode in meinem Fragmente fahre ich bekam:
java.lang.IllegalStateException: Dieses Realm Beispiel wurde bereits geschlossen, es unbrauchbar zu machen.
Aber nach diesem Fehler, wenn neu laden Fragment funktioniert alles in Ordnung. Und vor diesem ersten Fragment führen Sie Methoden aus, die von Services-Klassen aufrufen, und funktioniert gut. Zum Beispiel: Diese Methode funktioniert perfekt, auch wenn es zuerst ausführen:
public Observable<ModuleRealm> getModule(String moduleTitle) {
return execute(realm -> realm.where(ModuleRealm.class)
.equalTo("code", moduleTitle)
.findAllAsync()
.asObservable()
.first()
.map(RealmResults::first));
}
Aber diese löst eine Ausnahme:
public Observable<List<ProductCategoryRealm>> getProductCategories() {
return execute(realm -> realm.where(ProductCategoryRealm.class)
.findAll()
.asObservable()
.first()
.map(realm::copyFromRealm));
}
Wie kann ich das zurückbleiben = 0? – Drake
Schreiben Sie eine RealmWrapper-Klasse: P – Submersed
@Submersed Sind Sie 100% sicher über Ihre Schlussfolgerung? Ich kann einfach nicht glauben, dass Null-Referenzen Realm bis zum nächsten Aufruf von init() geschlossen haben. Ja, es kann alle zwischengespeicherten Daten löschen, aber das Aufrufen von getDefaultInstance() sollte es erneut selbst initiieren, nicht wahr? – skywall