Kotlin | Uso por mecanismo de delegación para encapsular SharedPreference

escrito en frente

KotlinEl mecanismo de delegación es una función de lenguaje muy flexible que nos permite delegar algunas propiedades o métodos de un objeto a otros objetos para su procesamiento. Los más comunes son 类委托, 属性委托y para un uso detallado, consulte: Kotlin | 10 minutos para hacerlo mediante el mecanismo de delegación .

Nota : este artículo no explicará en detalle qué es el mecanismo de delegación. Si no sabe cuál es el mecanismo de delegación, puede hacer clic en el enlace de arriba para aprender.

Este artículo es byla práctica del mecanismo de delegación, que utiliza el mecanismo de delegación para encapsular SharedPreference(en lo sucesivo, ) para simplificar su uso. El método de datos de acceso predeterminado es el siguiente:spsp

  • SharedPreferenceGuardar datos:
//获得SharedPreferences的实例 sp_name是文件名
val sp: SharedPreferences = getSharedPreferences("sp_name", Context.MODE_PRIVATE)
//获得Editor 实例
val editor: SharedPreferences.Editor = sp.edit()
//以key-value形式保存数据
editor.putString("data_key", "data")
//apply()是异步写入数据
editor.apply()
//commit()是同步写入数据 
//editor.commit()

  • SharedPreferenceObtener datos:
//获得SharedPreferences的实例
val sp = getSharedPreferences("sp_name", MODE_PRIVATE)
//通过key值获取到相应的data,如果没取到,则返回后面的默认值
val data = sp.getString("data_key", "defaultValue")

Por lo general, en el proyecto, lo encapsularemos de SPUtilmanera similar, pero sptodavía es un poco problemático de usar. A continuación, usaremos byel mecanismo de delegación para spencapsular de manera más elegante.

Utilice el mecanismo de delegación para encapsular SharedPreference

/**
 * SharedPreferences委托代理
 * @param context Context
 * @param spName SP存入的XML名字
 * @param defaultValue 默认值
 * @param key 存取数据时对应的key
 */
class SharedPreferencesDelegate<T>(
    private val context: Context,
    private val spName: String,
    private val defaultValue: T,
    private val key: String? = null,
) : ReadWriteProperty<Any?, T> {

    private val sp: SharedPreferences by lazy(LazyThreadSafetyMode.NONE) {
        context.getSharedPreferences(spName, Context.MODE_PRIVATE)
    }

    override fun getValue(thisRef: Any?, property: KProperty<*>): T {
        val finalKey = key ?: property.name
        return when (defaultValue) {
            is Int -> sp.getInt(finalKey, defaultValue)
            is Long -> sp.getLong(finalKey, defaultValue)
            is Float -> sp.getFloat(finalKey, defaultValue)
            is Boolean -> sp.getBoolean(finalKey, defaultValue)
            is String -> sp.getString(finalKey, defaultValue)
            is Set<*> -> sp.getStringSet(finalKey, defaultValue as? Set<String>)
            else -> throw IllegalStateException("Unsupported type")
        } as T
    }

    override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
        val finalKey = key ?: property.name
        with(sp.edit()) {
            when (value) {
                is Int -> putInt(finalKey, value)
                is Long -> putLong(finalKey, value)
                is Float -> putFloat(finalKey, value)
                is Boolean -> putBoolean(finalKey, value)
                is String -> putString(finalKey, value)
                is Set<*> -> putStringSet(finalKey, value.map { it.toString() }.toHashSet())
                else -> throw IllegalStateException("Unsupported type")
            }
            apply()
        }
    }
}

úsalo:

class CommonPreferences(context: Context) {
    companion object {
        /**
         * 通过传入不同的SP文件名来存储到不同的XML中
         */
        const val FIR_SP_NAME = "FIR_SP_NAME" //文件名1
        const val SEC_SP_NAME = "SEC_SP_NAME"//文件名2
    }

    var isShow by SharedPreferencesDelegate(context, FIR_SP_NAME, false, "key_is_show")

    //这里没有用key值,则会默认使用属性名来当做key值
    var name by SharedPreferencesDelegate(context, FIR_SP_NAME, "")

    var age by SharedPreferencesDelegate(context, SEC_SP_NAME, 0, "key_age")

    //这里没有用key值,则会默认使用属性名来当做key值
    var cost by SharedPreferencesDelegate(context, SEC_SP_NAME, 0.0f)
}

El código anterior muestra que los datos se almacenan en diferentes archivos según los diferentes nombres de archivo XML, y puede ajustarlos según sus necesidades. ActivityAcceder a valores en :

private val spInfo = CommonPreferences(this)
//存值
spInfo.isShow = true
spInfo.name = "小马快跑"
//存值
spInfo.age = 18
spInfo.cost = 123.4f
spInfo.setString = setOf("一", "二", "三")
//取值
log("isShow -> ${spInfo.isShow}, name -> ${spInfo.name}")
log("age -> ${spInfo.age}, cost -> ${spInfo.cost},setString -> ${spInfo.setString}")

Se puede ver que spel valor de acceso de no es demasiado simple, es similar al acceso de las propiedades del objeto, mira los resultados de la ejecución:

E/TTT: isShow -> true, name -> 小马快跑
E/TTT: age -> 18, cost -> 123.4,setString -> [一, 三, 二]

El valor se recupera con éxito, entonces, ¿qué pasa con el almacenamiento del valor? Ver si hay algún dato almacenado en el directorio correspondiente del teléfono móvil:

XML1
Bueno, el valor de acceso es exitoso.

Resumir

El uso principal es la delegación de atributos val/var <属性名>: <类型> by <表达式>, por ejemplo:

var isShow by SharedPreferencesDelegate(context, FIR_SP_NAME, false, "key_is_show")

A través SharedPreferencesDelegatede la lógica de la ejecución del código de atributo para la operación de acceso, no tiene que preocuparse por todos los detalles de acceso, ¡ bien !

por fin

Si desea convertirse en arquitecto o quiere superar el rango de salario de 20-30K, entonces no se limite a la codificación y los negocios, sino que debe poder seleccionar modelos, expandir y mejorar el pensamiento de programación. Además, un buen plan de carrera también es muy importante, y el hábito de aprender es muy importante, pero lo más importante es poder perseverar, cualquier plan que no se pueda implementar de manera constante es una palabrería.

Si no tiene una dirección, aquí me gustaría compartir con usted un conjunto de "Notas avanzadas sobre los ocho módulos principales de Android" escrito por el arquitecto principal de Ali, para ayudarlo a organizar el conocimiento desordenado, disperso y fragmentado de manera sistemática, para que que puede dominar de manera sistemática y eficiente los diversos puntos de conocimiento del desarrollo de Android.
inserte la descripción de la imagen aquí
En comparación con el contenido fragmentado que solemos leer, los puntos de conocimiento de esta nota son más sistemáticos, más fáciles de entender y recordar, y están organizados estrictamente de acuerdo con el sistema de conocimiento.

Conjunto completo de materiales de video:

1. Colección de entrevistas

inserte la descripción de la imagen aquí
2. Colección de análisis de código fuente
inserte la descripción de la imagen aquí

3. La colección de marcos de código abierto
inserte la descripción de la imagen aquí
invita a todos a apoyar con un clic y tres enlaces. Si necesita la información del artículo, simplemente haga clic en la tarjeta WeChat de certificación oficial de CSDN al final del artículo para obtenerla gratis↓↓↓

Supongo que te gusta

Origin blog.csdn.net/Eqiqi/article/details/131691197
Recomendado
Clasificación