Kotlin 패키지 만능 Shared Preferences 액세스 형식 에 대한 자세 한 설명

Kotlin 패키지 만능 Shared Preferences 액세스 형식 에 대한 자세 한 설명

/**
 * 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"))
이 문 구 는 전역 변수 에 놓 고 읽 어야 합 니 다.값 이 바 뀌 거나 값 이 바 뀌 면 이 값 은 스스로 제출 하고 동기 화 됩 니 다.
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기