全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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存储功能实现方法  # 序列化  # 的是  # 放在  # 当你  # 要在  # 这条  # 希望能  # 谢谢大家  # 方法来  # 装好  # 全局变量  # 以防止  # putPreference  # MODE_PRIVATE  # property  # setValue  # thisRef  # getValue  # fun  # override 


相关文章: 整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  建站主机核心功能解析:服务器选择与网站搭建流程指南  建站之星好吗?新手能否轻松上手建站?  如何做网站制作流程,*游戏网站怎么搭建?  大连网站设计制作招聘信息,大连投诉网站有哪些?  建站主机数据库如何配置才能提升网站性能?  如何通过宝塔面板实现本地网站访问?  Android自定义listview布局实现上拉加载下拉刷新功能  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  建站上市公司网站建设方案与SEO优化服务定制指南  网站制作网站,深圳做网站哪家比较好?  如何在VPS电脑上快速搭建网站?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  实例解析angularjs的filter过滤器  专业商城网站制作公司有哪些,pi商城官网是哪个?  定制建站流程解析:需求评估与SEO优化功能开发指南  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  南京网站制作费用,南京远驱官方网站?  如何通过VPS建站实现广告与增值服务盈利?  Swift开发中switch语句值绑定模式  网站制作公司排行榜,四大门户网站排名?  如何在云服务器上快速搭建个人网站?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  如何在万网主机上快速搭建网站?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  建站之星展会模版如何一键下载生成?  如何在腾讯云服务器快速搭建个人网站?  如何通过万网虚拟主机快速搭建网站?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  常州自助建站费用包含哪些项目?  网站网页制作专业公司,怎样制作自己的网页?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  官网建站费用明细查询_企业建站套餐价格及收费标准指南  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  如何用免费手机建站系统零基础打造专业网站?  制作网站的软件免费下载,免费制作app哪个平台好?  想学网站制作怎么学,建立一个网站要花费多少?  如何选择最佳自助建站系统?快速指南解析优劣  建站主机助手选型指南:2025年热门推荐与高效部署技巧  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  建站之星代理如何获取技术支持?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  如何快速生成橙子建站落地页链接? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。