Android

Android Kotlin SharedPreferences

2021-07-30  本文已影响0人  Charles2018

Usage:

var value:String by Preference("name","Onlly Archibald")
        println("now value is $value")

        value = "Mark"
        println("after value is $value")

        var person:Person by Preference("person",Person(name = "Onlly",age = 25))
        println("now person is $person")

        person = Person(name = "Onlly",age = 26)
        println("after person is $person")

data class Person(private val name:String,private val age:Int):Serializable

OUTPUT:


捕获.PNG

Preference.kt

class Preference<T>(private val name:String,private val default:T){
    companion object{
        private val pref: SharedPreferences by lazy{
            OCOMPayApplicationLike.INSTANCE.getSharedPreferences("test", Context.MODE_PRIVATE)
        }
    }

    operator fun getValue(thisRef:Any?,property:KProperty<*>):T = with(pref){
        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)))
        }
        return res as T
    }

    operator fun setValue(thisRef:Any?,property: KProperty<*>,value:T) = with(pref.edit()){
        when(value){
            is Long -> putLong(name,value)
            is Float -> putFloat(name,value)
            is Boolean -> putBoolean(name,value)
            is Int -> putInt(name,value)
            is String -> putString(name,value)
            else -> putString(name,serialize(value))
        }.commit()
    }

    @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
    }

    @Suppress("UNCHECKED_CAST")
    @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
    }
}
上一篇 下一篇

猜你喜欢

热点阅读