Wazing


无醇酒美人,不愿来此人间,无快剑挚友,不愿老此江湖。


Kotlin SharedPreferences最佳实现

[TOC]

关于

用于访问和修改返回的首选项数据的接口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)
取消注册先前的回调。

上面表格乱版的 —»> Jokey’s blog 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就可以开始用。

效果图:

<div align=center></div>

更早的文章

Application单例化和属性的Delegated

[TOC]我们很快要去实现一个数据库,如果我们想要保持我们代码的简洁性和层次性(而不是把所有代码添加到Activity中),我们就要需要有一个更简单的访问application context的方式。java方式实现按照我们在Java中一样创建一个单例最简单的方式:class App : Application() { companion object { private var instance: Application? = null fun inst...…

Android Kotlin继续阅读