大佬教程收集整理的这篇文章主要介绍了Kotlin 封装万能SharedPreferences存取任何类型详解,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
Kotlin 封装万能SharedPreferences存取任何类型详解
/** * author: smart * time: 2016/10/26 * 封装好SharedPreferences 并使用 序列化和反序列化来存储数据 * 注意要在全局环境使用 */ 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) } /** * 查找数据 返回给调用方法一个具体的对象 * 如果查找不到类型就采用反序列化方法来返回类型 * default是默认对象 以防止会返回空对象的异常 * 即如果name没有查找到value 就返回默认的序列化对象,然后经过反序列化返回 */ 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() } /** * 删除全部数据 */ fun clearPreference(){ prefs.edit().clear().commit() } /** * 根据key删除存储数据 */ 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 } }
这里主要用的是代理模式,还有数据类要实现序列化serializable接口,使用方式:
var save : LoginSaveBean by Preference<LoginSaveBean>(App.geTinstance(),Constant.LOCAL_SAVE_LOGIN_MODEL_KEY,LoginSaveBean("0","0"))
注意 这条语句我们要放在全局变量来读取,当你改变值或者值被改变时,这里的值会自己提交和同步。
感谢 阅读,希望能帮助到大家,谢谢大家对本站的支持!
以上是大佬教程为你收集整理的Kotlin 封装万能SharedPreferences存取任何类型详解全部内容,希望文章能够帮你解决Kotlin 封装万能SharedPreferences存取任何类型详解所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。