全网整合营销服务商

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

免费咨询热线: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 


相关文章: 标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  常州自助建站费用包含哪些项目?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  建站之星2.7模板:企业网站建设与h5定制设计专题  公众号网站制作网页,微信公众号怎么制作?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  如何在Ubuntu系统下快速搭建WordPress个人网站?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  建站之星CMS五站合一模板配置与SEO优化指南  南宁网站建设制作定制,南宁网站建设可以定制吗?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  建站主机数据库如何配置才能提升网站性能?  高端建站如何打造兼具美学与转化的品牌官网?  如何在七牛云存储上搭建网站并设置自定义域名?  如何构建满足综合性能需求的优质建站方案?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  如何在搬瓦工VPS快速搭建网站?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  如何在宝塔面板中创建新站点?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  定制建站哪家更专业可靠?推荐榜单揭晓  南京网站制作费用,南京远驱官方网站?  建站之星备案流程有哪些注意事项?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  网站网页制作专业公司,怎样制作自己的网页?  SQL查询语句优化的实用方法总结  html制作网站的步骤有哪些,iapp如何添加网页?  如何在景安云服务器上绑定域名并配置虚拟主机?  如何获取开源自助建站系统免费下载链接?  常州企业网站制作公司,全国继续教育网怎么登录?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  宝塔新建站点报错如何解决?  建站之星如何快速更换网站模板?  如何在建站之星网店版论坛获取技术支持?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  如何自定义建站之星网站的导航菜单样式?  网页设计与网站制作内容,怎样注册网站?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  如何用wdcp快速搭建高效网站?  Android滚轮选择时间控件使用详解  如何通过宝塔面板实现本地网站访问?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  高防服务器租用如何选择配置与防御等级?  建站之星如何配置系统实现高效建站?  如何在建站主机中优化服务器配置?  如何快速搭建支持数据库操作的智能建站平台?  简历在线制作网站免费版,如何创建个人简历? 

您的项目需求

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