joh*_*crq 8 android realm kotlin
我目前正在我的应用程序中使用Realm,为了确保我正确管理Realm实例,我在我的基本Activity中引入了一个如下变量:
protected val realm: Realm by lazy {
Realm.getDefaultInstance()
}
Run Code Online (Sandbox Code Playgroud)
然后在onDestroy中我这样做:
override fun onDestroy() {
super.onDestroy()
realm.close()
}
Run Code Online (Sandbox Code Playgroud)
然后我意识到这是一种浪费.如果当前活动不使用领域,它将打开并立即关闭onDestroy.
所以我更新到这个:
private var usedRealm = false
protected val realm: Realm by lazy {
usedRealm = true
Realm.getDefaultInstance()
}
override fun onDestroy() {
super.onDestroy()
if (usedRealm) {
realm.close()
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法完成同样的事情,没有额外的旗帜?
mfu*_*n26 15
您当前的实施中存在一个错误.如果Realm.getDefaultInstance()抛出然后usedRealm将被设置为true但是懒惰实际上不会被初始化(初始化将失败).你可以通过调用usedRealm = true 后调用来解决这个问题Realm.getDefaultInstance():
protected val realm: Realm by lazy {
val realm = Realm.getDefaultInstance()
usedRealm = true
realm
}
Run Code Online (Sandbox Code Playgroud)
要么
protected val realm: Realm by lazy {
Realm.getDefaultInstance().apply { usedRealm = true }
}
Run Code Online (Sandbox Code Playgroud)通过保持对原始Lazy对象本身的引用,您可以在没有额外标志的情况下完成相同的操作:
private val lazyRealm = lazy { Realm.getDefaultInstance() }
protected val realm by lazyRealm
override fun onDestroy() {
super.onDestroy()
if (lazyRealm.isInitialized()) {
realm.close()
}
}
Run Code Online (Sandbox Code Playgroud)
这仍然需要一个额外的字段,但您不必再自己维护初始化状态.
您也可以Lazy直接使用而不是作为委托:
protected val lazyRealm = lazy { Realm.getDefaultInstance() }
override fun onDestroy() {
super.onDestroy()
if (lazyRealm.isInitialized()) {
lazyRealm.value.close()
}
}
Run Code Online (Sandbox Code Playgroud)
要么
protected val lazyRealm = lazy { Realm.getDefaultInstance() }
override fun onDestroy() {
super.onDestroy()
with(lazyRealm) {
if (isInitialized()) {
value.close()
}
}
}
Run Code Online (Sandbox Code Playgroud)
这使它没有额外的属性,但Lazy现在是你的API的一部分,realm你现在必须引用的任何地方你只需引用lazyRealm.value.你要权衡利弊.:-)
| 归档时间: |
|
| 查看次数: |
1147 次 |
| 最近记录: |