如何在Kotlin中存储和检索singleton类的对象



给定一个单例类

object singleton{
...
}

我使用一个singleton来存储一些与对象相关的值。我正在尝试使用SharedPreferences存储和检索它,以便下次打开应用程序时可以使用这些数据。我还需要在所有活动中使用这个对象(一旦检索到(。然而,当我做时

val x = singleton

我可以存储对象,但不能作为直接访问属性

singleton.propertyName

因此,我想问有没有其他比使用SharedPreferences更好的存储和检索方法如果我使用

x.propertyName

那么,仅仅使用访问不是一种简单的方法吗

singleton.propertyName 

迷路了吗?

此外,如果SharedPreferences不是存储该对象的方法,还有其他方法吗?

这里有一个链接,带参数的Singletons-Medium

为了完成您的代码,请键入:val r = singleton然后检索您的对象。

您不必编写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()
}
}
}

我不使用singleton对象,而是将所有内容作为Context上的扩展函数来实现。我发现这是一种比将pref加载到RAM一次,然后在应用程序的使用寿命内错过可能的更新更安全的方法。

请注意,为了设置属性,我不使用自定义setter,而是在Editor上使用扩展函数。这允许我在共享prefs上对同一事务中的几个更新进行分组:

context.sharedPrefs.applyUpdate {
setLastReloadedTimestamp(System.currentTimeMillis())
setLocationLat(location.lat)
setLocationLon(location.lon)
}

最新更新