Kotlin 封裝萬能SharedPreferences存取任何類型詳解
Kotlin 封裝萬能SharedPreferences存取任何類型詳解
/** * author: smart * time: 2016/10/26 * 封裝好SharedPreferences 并使用 序列化和反序列化來存儲數(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)用方法一個具體的對象 * 如果查找不到類型就采用反序列化方法來返回類型 * default是默認對象 以防止會返回空對象的異常 * 即如果name沒有查找到value 就返回默認的序列化對象,然后經(jīng)過反序列化返回 */ 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刪除存儲數(shù)據(jù) */ fun clearPreference(key : String){ prefs.edit().remove(key).commit() } /** * 序列化對象 * @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 } /** * 反序列化對象 * @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ù)類要實現(xiàn)序列化Serializable接口,使用方式:
var save : LoginSaveBean by Preference<LoginSaveBean>(App.getInstance(),Constant.LOCAL_SAVE_LOGIN_MODEL_KEY, LoginSaveBean("0","0"))
注意 這條語句我們要放在全局變量來讀取,當你改變值或者值被改變時,這里的值會自己提交和同步。
感謝 閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
flutter FadeTransition實現(xiàn)透明度漸變動畫
這篇文章主要為大家詳細介紹了flutter FadeTransition實現(xiàn)透明度漸變動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-07-07Android中Splash應(yīng)用啟動白屏問題的解決方法
這篇文章主要為大家詳細介紹了Android中Splash應(yīng)用啟動白屏問題的兩種解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02Matrix的set,pre,post調(diào)用順序詳解
下面小編就為大家?guī)硪黄狹atrix的set,pre,post調(diào)用順序詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04Android布局耗時監(jiān)測的三種實現(xiàn)方式
在Android應(yīng)用開發(fā)中,性能優(yōu)化是一個至關(guān)重要的方面,為了更好地監(jiān)測布局渲染的耗時,我們需要一種可靠的實現(xiàn)方案,本文將介紹三種針對Android布局耗時監(jiān)測的實現(xiàn)方案,幫助開發(fā)者及時發(fā)現(xiàn)并解決布局性能問題,需要的朋友可以參考下2024-03-03Android將Xamarin For VS升級為4.1.0.530版教程
這篇文章主要介紹了Android將Xamarin For VS升級為4.1.0.530版的圖文教程,感興趣的小伙伴們可以參考一下2016-06-06android教程之textview解析帶圖片的html示例
本文介紹的示例適用于android中需要解析帶圖片的htlm數(shù)據(jù),需要的朋友可以參考下2014-02-02