亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Kotlin 封裝萬能SharedPreferences存取任何類型詳解

 更新時間:2017年05月19日 15:54:39   投稿:lqh  
這篇文章主要介紹了Kotlin 封裝萬能SharedPreferences存取任何類型詳解的相關(guān)資料,需要的朋友可以參考下

Kotlin 封裝萬能SharedPreferences存取任何類型詳解

/**
 * author: smart
 * time: 2016/10/26
 * 封裝好SharedPreferences 并使用 序列化和反序列化來存儲數(shù)據(jù)
 * 注意要在全局環(huán)境使用
 */
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)
  }

  /**
   * 查找數(shù)據(jù) 返回給調(diào)用方法一個具體的對象
   * 如果查找不到類型就采用反序列化方法來返回類型
   * default是默認對象 以防止會返回空對象的異常
   * 即如果name沒有查找到value 就返回默認的序列化對象,然后經(jīng)過反序列化返回
   */
  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()

  }

  /**
   * 刪除全部數(shù)據(jù)
   */
  fun clearPreference(){
    prefs.edit().clear().commit()
  }

  /**
   * 根據(jù)key刪除存儲數(shù)據(jù)
   */
  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
  }
}

這里主要用的是代理模式,還有數(shù)據(jù)類要實現(xiàn)序列化Serializable接口,使用方式:

 var save : LoginSaveBean by Preference<LoginSaveBean>(App.getInstance(),Constant.LOCAL_SAVE_LOGIN_MODEL_KEY, LoginSaveBean("0","0"))

注意 這條語句我們要放在全局變量來讀取,當你改變值或者值被改變時,這里的值會自己提交和同步。

感謝 閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • flutter FadeTransition實現(xiàn)透明度漸變動畫

    flutter FadeTransition實現(xiàn)透明度漸變動畫

    這篇文章主要為大家詳細介紹了flutter FadeTransition實現(xiàn)透明度漸變動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • android實現(xiàn)上下滾動的TextView

    android實現(xiàn)上下滾動的TextView

    android實現(xiàn)上下滾動的TextView,需要的朋友可以參考一下
    2013-05-05
  • Android仿微信朋友圈全文收起功能示例(附源碼)

    Android仿微信朋友圈全文收起功能示例(附源碼)

    本篇文章主要介紹了Android仿微信朋友圈全文收起功能示例(附源碼),非常具有實用價值,需要的朋友可以參考下。
    2017-02-02
  • Java ArrayList源碼深入分析

    Java ArrayList源碼深入分析

    ArrayList 類是一個可以動態(tài)修改的數(shù)組,與普通數(shù)組的區(qū)別就是它是沒有固定大小的限制,我們可以添加或刪除元素。ArrayList 繼承了 AbstractList,并實現(xiàn)了List接口
    2022-08-08
  • Android中Splash應(yīng)用啟動白屏問題的解決方法

    Android中Splash應(yīng)用啟動白屏問題的解決方法

    這篇文章主要為大家詳細介紹了Android中Splash應(yīng)用啟動白屏問題的兩種解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Android Studio引入FFmpeg的方法

    Android Studio引入FFmpeg的方法

    這篇文章主要介紹了Android Studio引入FFmpeg的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Matrix的set,pre,post調(diào)用順序詳解

    Matrix的set,pre,post調(diào)用順序詳解

    下面小編就為大家?guī)硪黄狹atrix的set,pre,post調(diào)用順序詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Android布局耗時監(jiān)測的三種實現(xiàn)方式

    Android布局耗時監(jiān)測的三種實現(xiàn)方式

    在Android應(yīng)用開發(fā)中,性能優(yōu)化是一個至關(guān)重要的方面,為了更好地監(jiān)測布局渲染的耗時,我們需要一種可靠的實現(xiàn)方案,本文將介紹三種針對Android布局耗時監(jiān)測的實現(xiàn)方案,幫助開發(fā)者及時發(fā)現(xiàn)并解決布局性能問題,需要的朋友可以參考下
    2024-03-03
  • Android將Xamarin For VS升級為4.1.0.530版教程

    Android將Xamarin For VS升級為4.1.0.530版教程

    這篇文章主要介紹了Android將Xamarin For VS升級為4.1.0.530版的圖文教程,感興趣的小伙伴們可以參考一下
    2016-06-06
  • android教程之textview解析帶圖片的html示例

    android教程之textview解析帶圖片的html示例

    本文介紹的示例適用于android中需要解析帶圖片的htlm數(shù)據(jù),需要的朋友可以參考下
    2014-02-02

最新評論