Kotlin 封装万能SharedPreferences存取任何类型详解
Kotlin封装万能SharedPreferences存取任何类型详解
/** *author:smart *time:2016/10/26 *封装好SharedPreferences并使用序列化和反序列化来存储数据 *注意要在全局环境使用 */ classPreference(valcontext:Context,valname:String,valdefault:T):ReadWriteProperty { valprefsbylazy{context.getSharedPreferences("Realnen",Context.MODE_PRIVATE)} overridefungetValue(thisRef:Any?,property:KProperty<*>):T{ returnfindPreference(name,default) } overridefunsetValue(thisRef:Any?,property:KProperty<*>,value:T){ putPreference(name,value) } /** *查找数据返回给调用方法一个具体的对象 *如果查找不到类型就采用反序列化方法来返回类型 *default是默认对象以防止会返回空对象的异常 *即如果name没有查找到value就返回默认的序列化对象,然后经过反序列化返回 */ privatefunfindPreference(name:String,default:A):A=with(prefs){ valres:Any=when(default){ isLong->getLong(name,default) isString->getString(name,default) isInt->getInt(name,default) isBoolean->getBoolean(name,default) isFloat->getFloat(name,default) else->deSerialization(getString(name,serialize(default))) } resasA } privatefunputPreference(name:String,value:A)=with(prefs.edit()){ when(value){ isLong->putLong(name,value) isString->putString(name,value) isInt->putInt(name,value) isBoolean->putBoolean(name,value) isFloat->putFloat(name,value) else->putString(name,serialize(value)) }.apply() } /** *删除全部数据 */ funclearPreference(){ prefs.edit().clear().commit() } /** *根据key删除存储数据 */ funclearPreference(key:String){ prefs.edit().remove(key).commit() } /** *序列化对象 *@paramperson ** *@return ** *@throwsIOException */ @Throws(IOException::class) privatefunserialize(obj:A):String{ valbyteArrayOutputStream=ByteArrayOutputStream() valobjectOutputStream=ObjectOutputStream( byteArrayOutputStream) objectOutputStream.writeObject(obj) varserStr=byteArrayOutputStream.toString("ISO-8859-1") serStr=java.net.URLEncoder.encode(serStr,"UTF-8") objectOutputStream.close() byteArrayOutputStream.close() returnserStr } /** *反序列化对象 *@paramstr ** *@return ** *@throwsIOException ** *@throwsClassNotFoundException */ @Throws(IOException::class,ClassNotFoundException::class) privatefundeSerialization(str:String):A{ valredStr=java.net.URLDecoder.decode(str,"UTF-8") valbyteArrayInputStream=ByteArrayInputStream( redStr.toByteArray(charset("ISO-8859-1"))) valobjectInputStream=ObjectInputStream( byteArrayInputStream) valobj=objectInputStream.readObject()asA objectInputStream.close() byteArrayInputStream.close() returnobj } }
这里主要用的是代理模式,还有数据类要实现序列化Serializable接口,使用方式:
varsave:LoginSaveBeanbyPreference(App.getInstance(),Constant.LOCAL_SAVE_LOGIN_MODEL_KEY,LoginSaveBean("0","0"))
注意这条语句我们要放在全局变量来读取,当你改变值或者值被改变时,这里的值会自己提交和同步。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!