给出一个单例课程
object singleton{
...
}
我正在使用单例存储一些与对象相关的值。我正在尝试使用SharedPreferences存储和检索它,以便下次打开应用程序时可以使用该数据。我还需要使用此对象(一旦检索到)在所有活动中。但是,当我这样做
val x = singleton
我可以存储对象,但是不能像
那样直接访问属性。 singleton.propertyName
因此,我问有没有其他方法可以比使用SharedPreferences更好的存储和检索方法了 如果我要使用
x.propertyName
那不是仅使用
进行访问的简单方法 singleton.propertyName
丢失了?
如果不是SharedPreferences的话,还有其他方法可以存储该对象吗?
答案 0 :(得分:0)
这是一个链接,Singletons with argument -Medium
完成代码,
请输入:val r = singleton
然后检索您的对象。
答案 1 :(得分:0)
您不必写x = singleton
,我在评论中写道,这只是一种询问您实际需求的方式。
您绝对应该使用SharedPreferences
进行持久存储,但是您也可以保留简单的singleton.propertyName
语法。您只需要实现自定义getter。这是我使用的一些摘要:
val Context.sharedPrefs: SharedPreferences get() =
PreferenceManager.getDefaultSharedPreferences(this)
val SharedPreferences.lastReloadedTimestamp: Long get() =
getLong(KEY_LAST_RELOADED_TIMESTAMP, 0L)
fun SharedPreferences.Editor.setLastReloadedTimestamp(value: Long): SharedPreferences.Editor =
putLong(KEY_LAST_RELOADED_TIMESTAMP, value)
inline fun SharedPreferences.applyUpdate(block: SharedPreferences.Editor.() -> Unit) {
with (edit()) {
try {
block()
} finally {
apply()
}
}
}
我不使用单例对象,而是将所有内容都实现为Context
上的扩展功能。与将首选项一次加载到RAM中然后在应用程序的生命周期中丢失可能的更新相比,我发现这是一种更安全的方法。
请注意,要设置属性,我不使用自定义设置器,而是使用Editor
上的扩展功能。这使我可以在共享事务上的同一事务中对多个更新进行分组:
context.sharedPrefs.applyUpdate {
setLastReloadedTimestamp(System.currentTimeMillis())
setLocationLat(location.lat)
setLocationLon(location.lon)
}