国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

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

2019-10-23 18:28:35
字體:
供稿:網(wǎng)友

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"))

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

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


注:相關教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 潮州市| 肥城市| 西青区| 徐闻县| 潢川县| 邳州市| 苏尼特右旗| 阿勒泰市| 双柏县| 泰州市| 土默特左旗| 太谷县| 株洲市| 宿州市| 金华市| 禄劝| 专栏| 镇江市| 长海县| 佛冈县| 邢台市| 环江| 周口市| 西林县| 柞水县| 尚义县| 铜山县| 松桃| 新丰县| 滕州市| 康定县| 万源市| 西华县| 大连市| 泰安市| 莱西市| 和硕县| 伽师县| 盐津县| 鄄城县| 治多县|