我可以将Realm.getDefaultInstance()。executeTransaction([transaction])称为" one-liner"?

时间:2016-03-04 19:25:08

标签: android realm

我一直在我正在开发的应用中使用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 }} 为了它)。我的想法是否正确,因此应继续使用第一个片段,或者我可以使用第二个片段吗?

1 个答案:

答案 0 :(得分:2)

第二个片段在某种意义上是有问题的,即Realm保留一个引用计数缓存,用于确定何时应该完全关闭底层资源,因此使用它意味着您保持底层资源打开,这可能导致OOM错误。删除Realm或尝试迁移它时也存在问题。

如果在后台线程上完成上述模式也是危险的,因为您在旧版本中打开Realm会导致您的文件大小增加,因为Realm必须跟踪多个版本:https://realm.io/docs/java/latest/#large-realm-file-size

如果在主线程上完成,这在技术上是安全的,但由于你在后台运行时不释放资源,因此应用程序被系统杀死的可能性要高得多。