Kotlin 封裝萬(wàn)能SharedPreferences存取任何類(lèi)型詳解
Kotlin 封裝萬(wàn)能SharedPreferences存取任何類(lèi)型詳解
/**
* author: smart
* time: 2016/10/26
* 封裝好SharedPreferences 并使用 序列化和反序列化來(lái)存儲(chǔ)數(shù)據(jù)
* 注意要在全局環(huán)境使用
*/
class Preference<T>(val context : Context,val name : String,val default : T) : ReadWriteProperty<Any?,T>{
val prefs by lazy{context.getSharedPreferences("Realnen",Context.MODE_PRIVATE)}
override fun getValue(thisRef: Any?, property: KProperty<*>): T {
return findPreference(name,default)
}
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
putPreference(name,value)
}
/**
* 查找數(shù)據(jù) 返回給調(diào)用方法一個(gè)具體的對(duì)象
* 如果查找不到類(lèi)型就采用反序列化方法來(lái)返回類(lèi)型
* default是默認(rèn)對(duì)象 以防止會(huì)返回空對(duì)象的異常
* 即如果name沒(méi)有查找到value 就返回默認(rèn)的序列化對(duì)象,然后經(jīng)過(guò)反序列化返回
*/
private fun <A> findPreference(name :String,default: A) : A = with(prefs){
val res : Any = when(default){
is Long -> getLong(name,default)
is String -> getString(name,default)
is Int -> getInt(name,default)
is Boolean -> getBoolean(name,default)
is Float -> getFloat(name,default)
else -> deSerialization(getString(name,serialize(default)))
}
res as A
}
private fun <A> putPreference(name :String,value: A) = with(prefs.edit()){
when(value){
is Long -> putLong(name,value)
is String -> putString(name,value)
is Int -> putInt(name,value)
is Boolean -> putBoolean(name,value)
is Float -> putFloat(name,value)
else -> putString(name,serialize(value))
}.apply()
}
/**
* 刪除全部數(shù)據(jù)
*/
fun clearPreference(){
prefs.edit().clear().commit()
}
/**
* 根據(jù)key刪除存儲(chǔ)數(shù)據(jù)
*/
fun clearPreference(key : String){
prefs.edit().remove(key).commit()
}
/**
* 序列化對(duì)象
* @param person
* *
* @return
* *
* @throws IOException
*/
@Throws(IOException::class)
private fun<A> serialize(obj: A): String {
val byteArrayOutputStream = ByteArrayOutputStream()
val objectOutputStream = ObjectOutputStream(
byteArrayOutputStream)
objectOutputStream.writeObject(obj)
var serStr = byteArrayOutputStream.toString("ISO-8859-1")
serStr = java.net.URLEncoder.encode(serStr, "UTF-8")
objectOutputStream.close()
byteArrayOutputStream.close()
return serStr
}
/**
* 反序列化對(duì)象
* @param str
* *
* @return
* *
* @throws IOException
* *
* @throws ClassNotFoundException
*/
@Throws(IOException::class, ClassNotFoundException::class)
private fun<A> deSerialization(str: String): A {
val redStr = java.net.URLDecoder.decode(str, "UTF-8")
val byteArrayInputStream = ByteArrayInputStream(
redStr.toByteArray(charset("ISO-8859-1")))
val objectInputStream = ObjectInputStream(
byteArrayInputStream)
val obj = objectInputStream.readObject() as A
objectInputStream.close()
byteArrayInputStream.close()
return obj
}
}
這里主要用的是代理模式,還有數(shù)據(jù)類(lèi)要實(shí)現(xiàn)序列化Serializable接口,使用方式:
var save : LoginSaveBean by Preference<LoginSaveBean>(App.getInstance(),Constant.LOCAL_SAVE_LOGIN_MODEL_KEY, LoginSaveBean("0","0"))
注意 這條語(yǔ)句我們要放在全局變量來(lái)讀取,當(dāng)你改變值或者值被改變時(shí),這里的值會(huì)自己提交和同步。
感謝 閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
flutter FadeTransition實(shí)現(xiàn)透明度漸變動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了flutter FadeTransition實(shí)現(xiàn)透明度漸變動(dòng)畫(huà),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
android實(shí)現(xiàn)上下滾動(dòng)的TextView
android實(shí)現(xiàn)上下滾動(dòng)的TextView,需要的朋友可以參考一下2013-05-05
Android中Splash應(yīng)用啟動(dòng)白屏問(wèn)題的解決方法
這篇文章主要為大家詳細(xì)介紹了Android中Splash應(yīng)用啟動(dòng)白屏問(wèn)題的兩種解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
Matrix的set,pre,post調(diào)用順序詳解
下面小編就為大家?guī)?lái)一篇Matrix的set,pre,post調(diào)用順序詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
Android布局耗時(shí)監(jiān)測(cè)的三種實(shí)現(xiàn)方式
在Android應(yīng)用開(kāi)發(fā)中,性能優(yōu)化是一個(gè)至關(guān)重要的方面,為了更好地監(jiān)測(cè)布局渲染的耗時(shí),我們需要一種可靠的實(shí)現(xiàn)方案,本文將介紹三種針對(duì)Android布局耗時(shí)監(jiān)測(cè)的實(shí)現(xiàn)方案,幫助開(kāi)發(fā)者及時(shí)發(fā)現(xiàn)并解決布局性能問(wèn)題,需要的朋友可以參考下2024-03-03
Android將Xamarin For VS升級(jí)為4.1.0.530版教程
這篇文章主要介紹了Android將Xamarin For VS升級(jí)為4.1.0.530版的圖文教程,感興趣的小伙伴們可以參考一下2016-06-06
android教程之textview解析帶圖片的html示例
本文介紹的示例適用于android中需要解析帶圖片的htlm數(shù)據(jù),需要的朋友可以參考下2014-02-02

