Как сохранить и получить объект синглтон-класса в Котлине - PullRequest
0 голосов
/ 03 декабря 2018

Учитывая класс синглтона

    object singleton{
    ...
    }

Я использую синглтон для хранения нескольких значений, связанных с объектом. Я пытаюсь сохранить и извлечь его с помощью SharedPreferences, чтобы в следующий раз приложениеоткрыт, я могу использовать эти данные. Мне также нужно использовать этот объект (после получения) для всех видов деятельности. Однако когда я делаю

    val x = singleton

, я могу сохранить объект, но не могу получить доступ к свойствам напрямуюas

    singleton.propertyName

Поэтому я спрашивал, есть ли другой способ хранения и извлечения, который лучше, чем использование SharedPreferences. Если бы я использовал

    x.propertyName

, тогда это не простой способдоступа с использованием просто

    singleton.propertyName 

потерян?

Также есть ли другой способ сохранить этот объект, если SharedPreferences не подходит?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Вам не нужно писать x = singleton, я написал это в своем комментарии просто как способ спросить вас, какова ваша реальная потребность.

Вы обязательно должны использовать SharedPreferences для постоянного хранения,но вы также можете сохранить простой синтаксис singleton.propertyName.Вы просто должны реализовать собственные методы получения.Вот некоторые фрагменты, которые я использую:

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.Я считаю, что это более безопасный способ, чем один раз загрузить префы в ОЗУ, а затем пропустить возможные обновления при жизни приложения.

Обратите внимание, что для установки свойств я не использую пользовательский установщик, а скорее функцию расширенияна Editor.Это позволяет мне сгруппировать несколько обновлений в одной транзакции по общим префиксам:

context.sharedPrefs.applyUpdate {
    setLastReloadedTimestamp(System.currentTimeMillis())
    setLocationLat(location.lat)
    setLocationLon(location.lon)
}
0 голосов
/ 03 декабря 2018

Вот ссылка, Одиночные с аргументом -Medium

, чтобы завершить код, введите: val r = singleton Затем ваш объект будет получен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...