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 &#39;ejs&#39;的解决办法  三星、SK海力士获美批准:可向中国出口芯片制造设备  网站制作免费,什么网站能看正片电影?  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  如何快速生成专业多端适配建站电话?  如何快速登录WAP自助建站平台?  Laravel怎么在Blade中安全地输出原始HTML内容  Bootstrap整体框架之JavaScript插件架构  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  Laravel如何使用withoutEvents方法临时禁用模型事件  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  大型企业网站制作流程,做网站需要注册公司吗?  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  独立制作一个网站多少钱,建立网站需要花多少钱?  怎么用AI帮你设计一套个性化的手机App图标?  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  网页设计与网站制作内容,怎样注册网站?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  香港服务器部署网站为何提示未备案?  如何快速建站并高效导出源代码?