Kotlin 封装万能SharedPreferences存取任何类型详解
发布时间 - 2026-01-11 01:11:30 点击率:次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存储功能实现方法
# 序列化
# 的是
# 放在
# 当你
# 要在
# 这条
# 希望能
# 谢谢大家
# 方法来
# 装好
# 全局变量
# 以防止
# putPreference
# MODE_PRIVATE
# property
# setValue
# thisRef
# getValue
# fun
# override
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
Laravel怎么使用Intervention Image库处理图片上传和缩放
linux top下的 minerd 木马清除方法
移动端脚本框架Hammer.js
教你用AI将一段旋律扩展成一首完整的曲子
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
如何在万网ECS上快速搭建专属网站?
Laravel如何使用查询构建器?(Query Builder高级用法)
,网页ppt怎么弄成自己的ppt?
智能起名网站制作软件有哪些,制作logo的软件?
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
装修招标网站设计制作流程,装修招标流程?
js代码实现下拉菜单【推荐】
Laravel安装步骤详细教程_Laravel环境搭建指南
Laravel如何集成Inertia.js与Vue/React?(安装配置)
使用豆包 AI 辅助进行简单网页 HTML 结构设计
如何获取PHP WAP自助建站系统源码?
如何挑选最适合建站的高性能VPS主机?
百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏
如何为不同团队 ID 动态生成多个独立按钮
Android中AutoCompleteTextView自动提示
Swift中switch语句区间和元组模式匹配
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
如何正确选择百度移动适配建站域名?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
如何有效防御Web建站篡改攻击?
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
node.js报错:Cannot find module 'ejs'的解决办法
三星、SK海力士获美批准:可向中国出口芯片制造设备
网站制作免费,什么网站能看正片电影?
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
如何快速生成专业多端适配建站电话?
如何快速登录WAP自助建站平台?
Laravel怎么在Blade中安全地输出原始HTML内容
Bootstrap整体框架之JavaScript插件架构
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
Laravel如何使用withoutEvents方法临时禁用模型事件
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
大型企业网站制作流程,做网站需要注册公司吗?
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
独立制作一个网站多少钱,建立网站需要花多少钱?
怎么用AI帮你设计一套个性化的手机App图标?
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
网页设计与网站制作内容,怎样注册网站?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
香港服务器部署网站为何提示未备案?
如何快速建站并高效导出源代码?

