Kotlin 패키지 만능 Shared Preferences 액세스 형식 에 대한 자세 한 설명
3985 단어 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"))
이 문 구 는 전역 변수 에 놓 고 읽 어야 합 니 다.값 이 바 뀌 거나 값 이 바 뀌 면 이 값 은 스스로 제출 하고 동기 화 됩 니 다.읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
머티리얼 디자인 도입 직후에 할 일안드로이드 프로젝트에 머티리얼 디자인을 도입한 후에 할 일을 적는다. Android 프로젝트를 만든 후 Hello world에 대해 수행합니다. 머티리얼 디자인을 도입하기 위해, build.gradle 를 이하와 같...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.