我一直在我正在开发的应用中使用Realm,并且发现自己一次又一次地输入这种模式:
try (Realm realm = Realm.getDefaultInstance()) {
realm.executeTransaction(tRealm -> {
// Execute some transaction in here
});
}
虽然它并不完全丑陋,而且我喜欢try-with-resources为我关闭realm
的事实,但我发现自己想知道将它简化为类似的东西是否足够这样:
Realm.getDefaultInstance().executeTransaction(tRealm -> {
// Execute some transaction in here
}
我更喜欢这两个,因为它的嵌套水平较低,而且因为我没有得到Realm的实例只是为了调用executeTransaction()
,然后给了我要使用的不同的 Realm实例。
但是我还没有切换到第二个片段,因为我担心它的Realm.getDefaultInstance()
部分会给我带来麻烦(因为我没有打电话给{{1 }} 为了它)。我的想法是否正确,因此应继续使用第一个片段,或者我可以使用第二个片段吗?
答案 0 :(得分:2)
第二个片段在某种意义上是有问题的,即Realm保留一个引用计数缓存,用于确定何时应该完全关闭底层资源,因此使用它意味着您保持底层资源打开,这可能导致OOM错误。删除Realm或尝试迁移它时也存在问题。
如果在后台线程上完成上述模式也是危险的,因为您在旧版本中打开Realm会导致您的文件大小增加,因为Realm必须跟踪多个版本:https://realm.io/docs/java/latest/#large-realm-file-size
如果在主线程上完成,这在技术上是安全的,但由于你在后台运行时不释放资源,因此应用程序被系统杀死的可能性要高得多。