2016-05-06 5 views
0

Ich bin ein wenig verwirrt darüber, wie/wann/warum die Realm-Instanzen geschlossen werden sollen. Im ganzen Verlauf meiner Anwendung habe ich niemals .close() auf meiner Realm-Instanz aufgerufen, weil ich die Realm-Objekte, mit denen ich mich beschäftige, nicht mehr verwenden kann, wenn ich sie schließe. Vielleicht wäre der Punkt zum Schließen der Realm-Instanz in meiner Anwendung onDestroy() genauso wie ich meine Instanz in meiner Anwendung onCreate() erstellen würde. Tatsächlich spiele ich mit einer Singleton-Instanz von Realm [*], die in meiner Anwendung erstellt wurde.Instantiieren und Schließen von Realm-Instanzen

Ist dies (ein Realm Singleton) ein guter Ansatz? Und was kann passieren, wenn ich mein Reich niemals schließe?

[*] Tatsächlich denke ich in einer Flywheight-Sammlung von Realm-Instanzen und speichere stattdessen eine Instanz pro Thread, da jetzt Service Intent in meiner App spielen und Realm von seinem Thread aus aufrufen muss. Ich denke, hier (in Service Intent), kann ich Realm in onDestroy() als Thread schließen, wird die Arbeit zu beenden.

Antwort

0

Realm behandelt internes Caching und macht es so leistungsfähig wie möglich. Sie sollten also keine Angst haben, Realm.getInstance() anzurufen. Der Grund dafür ist, dass close() erforderlich ist, dass Sie riskieren Speicher undicht zu verlieren, die schließlich Ihre App töten wird.

Kurz gesagt, Sie sollten kein Realm-Singleton oder ein anderes Caching-Muster selbst erstellen. Sie können hier zur Steuerung des Lebenszyklus Realm mehr über Best Practices lesen: https://realm.io/docs/java/latest/#controlling-the-lifecycle-of-realm-instances

Beachten Sie, dass Application.onDestroy() nicht nicht existiert und Application.onTerminate() ist nicht für normale Anwendungen genannt.

+0

zuerst danke für Ihre Zeit. Könntest du bitte ein wenig mehr den Punkt erklären, an dem Gefahr besteht, dass Speicher verloren geht, wenn Realm nicht geschlossen wird? Ich habe begonnen, Probleme des Typs zu begegnen: "IllegalStateException: Diese Realm-Instanz wurde bereits geschlossen, so dass sie unbenutzbar wird" und auf Realm von falschem Thread aus zugreifen. Danke im Voraus. –

+0

Realm weist eine Reihe von nativen Ressourcen unter der Haube zu. Wenn die Realms nicht geschlossen werden, bleiben sie auch wenn sie nicht mehr benötigt werden. Ein größeres Problem besteht jedoch darin, dass offene Realms die Version behalten, die sie verwenden. Daher müssen Hintergrundthreads, die das Realm nicht automatisch aktualisieren, weitere Änderungen verfolgen, die sich in Ihrer Realm-Datei vergrößern muss. –

Verwandte Themen