欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Kotlin SharedPreferences最佳实现

程序员文章站 2024-03-17 20:00:16
...

关于

用于访问和修改返回的首选项数据的接口Context.getSharedPreferences(String, int)。对于任何特定的首选项集,所有客户端共享此类的单个实例。对首选项的修改必须通过SharedPreferences.Editor对象来确保首选项值保持一致状态并在提交存储时进行控制。从各种get方法返回的对象必须被应用程序视为不可变。

注意:此类提供强大的一致性保证。它使用昂贵的操作可能会减慢应用程序的速度。经常改变可以容忍损失的属性或属性应该使用其他机制。有关详细信息读取上的评论 SharedPreferences.Editor.commit()SharedPreferences.Editor.apply()

注意:此类不支持跨多个进程使用。

概括

嵌套类:

接口 方法 注释
interface SharedPreferences.Editor 用于修改SharedPreferences 对象中的值的接口。
interface SharedPreferences.OnSharedPreferenceChangeListener 更改共享首选项时要调用的回调的接口定义。

公共方法:

返回值 函数名
abstract boolean contains(String key)
检查Preferences中是否包含此key
abstract SharedPreferences.Editor edit()
为这些首选项创建一个新的编辑器,通过该编辑器可以对首选项中的数据进行修改,并将这些更改原子地提交回SharedPreferences对象。
abstract Map getAll()
从首选项中检索所有值。
abstract boolean getBoolean(String key, boolean defValue)
从首选项中检索布尔值。
abstract float getFloat(String key, float defValue)
从首选项中检索浮点值。
abstract int getInt(String key, int defValue)
从首选项中检索int值。
abstract long getLong(String key, long defValue)
从首选项中检索长值。
abstract String getString(String key, String defValue)
从首选项中检索String值。
abstract Set getStringSet(String key, Set defValues)
从首选项中检索一组String值。
abstract void registerOnSharedPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener listener)
注册在首选项发生更改时调用的回调。
abstract void unregisterOnSharedPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener listener)
取消注册先前的回调。

https://developer.android.com/reference/android/content/SharedPreferences

kotlin中对SharedPreferences的封装

封装类:

import android.content.Context
import android.content.SharedPreferences
import android.preference.PreferenceManager
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty

open class SharedPreferencesUtils(context: Context) {

    private val preferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)

    var username by SharedPreferenceDelegates.string(defaultValue = "this is username")

    var age by SharedPreferenceDelegates.int()

    var flag by SharedPreferenceDelegates.boolean()

    var currentDateTime: Long by SharedPreferenceDelegates.long(System.currentTimeMillis())

    var money by SharedPreferenceDelegates.float()

    var setString by SharedPreferenceDelegates.setString()

    private object SharedPreferenceDelegates {

        fun int(defaultValue: Int = 0) = object : ReadWriteProperty<SharedPreferencesUtils, Int> {

            override fun getValue(thisRef: SharedPreferencesUtils, property: KProperty<*>): Int {
                return thisRef.preferences.getInt(property.name, defaultValue)
            }

            override fun setValue(thisRef: SharedPreferencesUtils, property: KProperty<*>, value: Int) {
                thisRef.preferences.edit().putInt(property.name, value).apply()
            }
        }

        fun long(defaultValue: Long = 0L) = object : ReadWriteProperty<SharedPreferencesUtils, Long> {

            override fun getValue(thisRef: SharedPreferencesUtils, property: KProperty<*>): Long {
                return thisRef.preferences.getLong(property.name, defaultValue)
            }

            override fun setValue(thisRef: SharedPreferencesUtils, property: KProperty<*>, value: Long) {
                thisRef.preferences.edit().putLong(property.name, value).apply()
            }
        }

        fun boolean(defaultValue: Boolean = false) = object : ReadWriteProperty<SharedPreferencesUtils, Boolean> {
            override fun getValue(thisRef: SharedPreferencesUtils, property: KProperty<*>): Boolean {
                return thisRef.preferences.getBoolean(property.name, defaultValue)
            }

            override fun setValue(thisRef: SharedPreferencesUtils, property: KProperty<*>, value: Boolean) {
                thisRef.preferences.edit().putBoolean(property.name, value).apply()
            }
        }

        fun float(defaultValue: Float = 0.0f) = object : ReadWriteProperty<SharedPreferencesUtils, Float> {
            override fun getValue(thisRef: SharedPreferencesUtils, property: KProperty<*>): Float {
                return thisRef.preferences.getFloat(property.name, defaultValue)
            }

            override fun setValue(thisRef: SharedPreferencesUtils, property: KProperty<*>, value: Float) {
                thisRef.preferences.edit().putFloat(property.name, value).apply()
            }
        }

        fun string(defaultValue: String? = null) = object : ReadWriteProperty<SharedPreferencesUtils, String?> {
            override fun getValue(thisRef: SharedPreferencesUtils, property: KProperty<*>): String? {
                return thisRef.preferences.getString(property.name, defaultValue)
            }

            override fun setValue(thisRef: SharedPreferencesUtils, property: KProperty<*>, value: String?) {
                thisRef.preferences.edit().putString(property.name, value).apply()
            }
        }

        fun setString(defaultValue: Set<String>? = null) = object : ReadWriteProperty<SharedPreferencesUtils, Set<String>?> {
            override fun getValue(thisRef: SharedPreferencesUtils, property: KProperty<*>): Set<String>? {
                return thisRef.preferences.getStringSet(property.name, defaultValue)
            }

            override fun setValue(thisRef: SharedPreferencesUtils, property: KProperty<*>, value: Set<String>?) {
                thisRef.preferences.edit().putStringSet(property.name, value).apply()
            }
        }
    }
}

使用:

import android.annotation.SuppressLint
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import com.wazing.room.utils.SharedPreferencesUtils
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    private val preferences by lazy { SharedPreferencesUtils(this) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        preferences.age = 56
        preferences.username = "刘德华"
        preferences.flag = true
        preferences.money = 9.30F
        preferences.currentDateTime = System.currentTimeMillis()
        preferences.setString = setOf("Android", "Ios")

        tv_content.text = StringBuffer().append(preferences.username)
                .append("\n").append(preferences.age)
                .append("\n").append(preferences.flag)
                .append("\n").append(preferences.money)
                .append("\n").append(preferences.currentDateTime)
                .append("\n").append(preferences.setString.toString())
    }
}

可以看出采用kotlin的委托属性更加方便,直接在SharedPreferencesUtils中定义属性,该属性作为key就可以开始用。

效果图:

Kotlin SharedPreferences最佳实现