像對象一樣操作SP

像對象一樣操作SP

一、使用示例

1.在PreferenceManager中添加需要存進SP的字段

class PreferenceManager {

    //用戶id,
    var userId: String by PreferenceProxy("")

    var age: Int by PreferenceProxy(0)

    var isMan: Boolean  by PreferenceProxy(false)

    var floatValue: Float  by PreferenceProxy(0.0f)

    var doubleValue: Double by PreferenceProxy(0.0)

    var bean: Bean  by PreferenceProxy(Bean.empty())
}

2.存值

App.preferenceManager .userId = "default userId"

3.取值

val value=App.preferenceManager .userId

二今野、原理

1.使用屬性代理,將PreferenceManager的字段的set/get方法托管給PreferenceProxy

var bean: Bean  by PreferenceProxy(Bean.empty())

2.PreferenceProxy實現(xiàn)ReadWriteProperty接口,重寫setValue/getValue方法

/**
 * SP的屬性代理
 */
class PreferenceProxy<T>(private val default: T) : ReadWriteProperty<Any?, T> {

    companion object {
        val context: Context by lazy {
            App.instance
        }
    }

    private val prefs by lazy {
        context.getSharedPreferences("xxxx", Context.MODE_PRIVATE)
    }

    private val gson by lazy {
        Gson()
    }

    private val map by lazy {
        HashMap<String, Any?>()
    }

    override fun getValue(thisRef: Any?, property: KProperty<*>): T = with(prefs) {
        val key = property.name
        //先取Map
        val mapValue = map[key]
        mapValue?.let {
            LogUtils.print("取Map:$key -> $it")
            return@with it as T
        }
        //Map沒有背传,才去取SP
        when (default) {
            is Long -> {
                var it = getLong(key, default) as T
                LogUtils.print("取SP-Long:$key -> $it")
                //退出應(yīng)用后膘格,再次進來時,SP還有值蜒车,但是Map沒有值了讳嘱,所以需要在第一次取SP后,存到Map酿愧,以后就不用再取SP了
                map[key] = it
                return@with it
            }
            is String -> {
                var it = getString(key, default) as T
                LogUtils.print("取SP-String:$key -> $it")
                map[key] = it
                return@with it
            }
            is Float -> {
                var it = getFloat(key, default) as T
                LogUtils.print("取SP-Float:$key -> $it")
                map[key] = it
                return@with it
            }
            is Int -> {
                var it = getInt(key, default) as T
                LogUtils.print("取SP-Int:$key -> $it")
                map[key] = it
                return@with it
            }
            is Boolean -> {
                var it = getBoolean(key, default) as T
                LogUtils.print("取SP-Boolean:$key -> $it")
                map[key] = it
                return@with it
            }
            else -> {
                val jsonString = getString(key, null)
                if (jsonString != null) {
                    LogUtils.print("取SP-Object:$key -> $jsonString")
                    val clazz = ClassUtil.getClazz(default)
                    var it = gson.fromJson(jsonString, clazz) as T
                    map[key] = it
                    return@with it
                } else {
                    LogUtils.print("取默認(rèn)值:$key -> $default")
                    return@with default
                }
            }
        }
    }

    override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) = with(prefs.edit()) {
        val key = property.name
        //先存SP
        val commit = when (value) {
            is Long -> {
                LogUtils.print("存SP-Long:$key -> $value")
                putLong(key, value)
            }
            is String -> {
                LogUtils.print("存SP-String:$key -> $value")
                putString(key, value)
            }
            is Float -> {
                LogUtils.print("存SP-Float:$key -> $value")
                putFloat(key, value)
            }
            is Int -> {
                LogUtils.print("存SP-Int:$key -> $value")
                putInt(key, value)
            }
            is Boolean -> {
                LogUtils.print("存SP-Boolean:$key -> $value")
                putBoolean(key, value)
            }
            else -> {
                var jsonString = gson.toJson(value)
                LogUtils.print("存SP-Object:$key -> $jsonString")
                putString(key, jsonString)
            }
        }.commit()
        //SP存成功了沥潭,再存Map
        if (commit) {
            LogUtils.print("存Map:$key -> $value")
            map[key] = value
        }
    }
}

之后再在自己的Application的伴生對象中,定義一個全局的靜態(tài)PreferenceManager即可

val preferenceManager: PreferenceManager by lazy {
            PreferenceManager()
        }

三嬉挡、特別提醒

為了防止Map和SP不一致钝鸽,以后所有的SP操作汇恤,都必須通過PreferenceManager,禁止直接使用SharedPreferences0吻 R蚧选!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颜懊,一起剝皮案震驚了整個濱河市财岔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌河爹,老刑警劉巖匠璧,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異咸这,居然都是意外死亡夷恍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門媳维,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酿雪,“玉大人,你說我怎么就攤上這事侄刽≈咐瑁” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵州丹,是天一觀的道長袋励。 經(jīng)常有香客問我,道長当叭,這世上最難降的妖魔是什么茬故? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮蚁鳖,結(jié)果婚禮上磺芭,老公的妹妹穿的比我還像新娘。我一直安慰自己醉箕,他們只是感情好钾腺,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著讥裤,像睡著了一般放棒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上己英,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天间螟,我揣著相機與錄音,去河邊找鬼。 笑死厢破,一個胖子當(dāng)著我的面吹牛荣瑟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摩泪,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼笆焰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了见坑?” 一聲冷哼從身側(cè)響起嚷掠,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荞驴,沒想到半個月后叠国,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡戴尸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了冤狡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孙蒙。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悲雳,靈堂內(nèi)的尸體忽然破棺而出挎峦,到底是詐尸還是另有隱情,我是刑警寧澤合瓢,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布坦胶,位于F島的核電站,受9級特大地震影響晴楔,放射性物質(zhì)發(fā)生泄漏顿苇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一税弃、第九天 我趴在偏房一處隱蔽的房頂上張望纪岁。 院中可真熱鬧,春花似錦则果、人聲如沸幔翰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遗增。三九已至,卻和暖如春款青,著一層夾襖步出監(jiān)牢的瞬間做修,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缓待,地道東北人蚓耽。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像旋炒,于是被迫代替她去往敵國和親步悠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容