“一行代码” 搞定 SharePreference
private var isBlockAll: Boolean by PreferenceDelegate(SpConstant.SP_BLOCK_ALL, false) //屏蔽所有
//打印值
loggerd("isBlockAll: $isBlockAll")
if (isBlockAll) {
...
} else {
...
}
哇,一行代码,感觉针不错!现在你就可以操作Sp存储的字段了
具体实现代码
import android.content.Context
import android.content.SharedPreferences
import com.guagua.sing.SingApplication
import com.guagua.sing.constant.SpConstant
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
import java.io.ObjectInputStream
import java.io.ObjectOutputStream
import java.net.URLDecoder
import java.net.URLEncoder
import kotlin.reflect.KProperty
/**
* Copyright (C), 2020-2021
* @author lxc
* Date: 2021/3/23 20:55
* Version: 1.0.0
* Description: kotlin委托属性+SharedPreference管理本地变量
* History:
* <author> <time> <version> <desc>
*/
class PreferenceDelegate<T>(val name: String, private val default: T) {
companion object {
private const val file_name = SpConstant.SP_NAME
private val prefs: SharedPreferences by lazy {
//使用上下文获取sp实例
App.getInstance().applicationContext.getSharedPreferences(file_name, Context.MODE_PRIVATE)
}
fun clearPreference() {
prefs.edit().clear().apply()
}
fun clearPreference(key: String) {
prefs.edit().remove(key).apply()
}
fun contains(key: String): Boolean = prefs.contains(key)
fun getAll(): Map<String, *> = prefs.all
}
operator fun getValue(thisRef: Any?, property: KProperty<*>): T = getSharedPreferences(name, default)
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) = putSharedPreferences(name, value)
private fun putSharedPreferences(name: String, value: T) = with(prefs.edit()) {
when(value) {
is Long -> putLong(name, value)
is Int -> putInt(name, value)
is Boolean -> putBoolean(name, value)
is Float -> putFloat(name, value)
is String -> putString(name, value)
else -> putString(name, serialize(value))
}.apply()
}
private fun<A> serialize(obj: A): String {
val byteArrayOutputStream = ByteArrayOutputStream()
val objectOutputStream = ObjectOutputStream(byteArrayOutputStream)
objectOutputStream.writeObject(obj)
var result = byteArrayOutputStream.toString("ISO-8859-1")
result =URLEncoder.encode(result, "UTF-8")
objectOutputStream.close()
byteArrayOutputStream.close()
return result
}
private fun getSharedPreferences(name: String, default: T): T = with(prefs) {
val res = 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)))
}
return res as T
}
private fun <A> deSerialization(str: String?): A {
val redStr = URLDecoder.decode(str, "UTF-8")
ObjectInputStream(ByteArrayInputStream(redStr.toByteArray(charset("ISO-8859-1")))).use {
return it.readObject() as A
}
}
}