【问题标题】:How to observe Changes in Shared Preference using LiveData?如何使用 LiveData 观察共享偏好的变化?
【发布时间】:2018-10-28 05:27:13
【问题描述】:

最近,我的一个项目需要观察整个应用程序中 SharedPreferences 的变化(我有活动、前台服务和 BroadcastReciever,它们会对 SharedPreferences 的变化做出不同的反应)。我还想仅在相应的 AppComponents 处于活动状态时才监听这些更改。因此,LiveData 将适合我的要求,但最好的方法是什么?

(出于文档目的提出问题,希望看到比下面的答案更好的实现)

【问题讨论】:

    标签: android kotlin sharedpreferences android-livedata


    【解决方案1】:

    以下代码是我在项目中一直使用的 SharedPreference 的 LiveData 实现。效果很好。

    package com.chargingwatts.chargingalarm.util.preference;
    
    import android.arch.lifecycle.LiveData
    import android.content.SharedPreferences
    
    abstract class SharedPreferenceLiveData<T>(val sharedPrefs: SharedPreferences,
                                               val key: String,
                                               val defValue: T) : LiveData<T>() {
    
        private val preferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener { sharedPreferences, key ->
            if (key == this.key) {
                value = getValueFromPreferences(key, defValue)
            }
        }
    
        abstract fun getValueFromPreferences(key: String, defValue: T): T
    
        override fun onActive() {
            super.onActive()
            value = getValueFromPreferences(key, defValue)
            sharedPrefs.registerOnSharedPreferenceChangeListener(preferenceChangeListener)
        }
    
        override fun onInactive() {
            sharedPrefs.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener)
            super.onInactive()
        }
    }
    
    class SharedPreferenceIntLiveData(sharedPrefs: SharedPreferences, key: String, defValue: Int) :
            SharedPreferenceLiveData<Int>(sharedPrefs, key, defValue) {
        override fun getValueFromPreferences(key: String, defValue: Int): Int = sharedPrefs.getInt(key, defValue)
    }
    
    class SharedPreferenceStringLiveData(sharedPrefs: SharedPreferences, key: String, defValue: String) :
            SharedPreferenceLiveData<String>(sharedPrefs, key, defValue) {
        override fun getValueFromPreferences(key: String, defValue: String): String = sharedPrefs.getString(key, defValue)
    }
    
    class SharedPreferenceBooleanLiveData(sharedPrefs: SharedPreferences, key: String, defValue: Boolean) :
            SharedPreferenceLiveData<Boolean>(sharedPrefs, key, defValue) {
        override fun getValueFromPreferences(key: String, defValue: Boolean): Boolean = sharedPrefs.getBoolean(key, defValue)
    }
    
    class SharedPreferenceFloatLiveData(sharedPrefs: SharedPreferences, key: String, defValue: Float) :
            SharedPreferenceLiveData<Float>(sharedPrefs, key, defValue) {
        override fun getValueFromPreferences(key: String, defValue: Float): Float = sharedPrefs.getFloat(key, defValue)
    }
    
    class SharedPreferenceLongLiveData(sharedPrefs: SharedPreferences, key: String, defValue: Long) :
            SharedPreferenceLiveData<Long>(sharedPrefs, key, defValue) {
        override fun getValueFromPreferences(key: String, defValue: Long): Long = sharedPrefs.getLong(key, defValue)
    }
    
    class SharedPreferenceStringSetLiveData(sharedPrefs: SharedPreferences, key: String, defValue: Set<String>) :
            SharedPreferenceLiveData<Set<String>>(sharedPrefs, key, defValue) {
        override fun getValueFromPreferences(key: String, defValue: Set<String>): Set<String> = sharedPrefs.getStringSet(key, defValue)
    }
    
    fun SharedPreferences.intLiveData(key: String, defValue: Int): SharedPreferenceLiveData<Int> {
        return SharedPreferenceIntLiveData(this, key, defValue)
    }
    
    fun SharedPreferences.stringLiveData(key: String, defValue: String): SharedPreferenceLiveData<String> {
        return SharedPreferenceStringLiveData(this, key, defValue)
    }
    
    fun SharedPreferences.booleanLiveData(key: String, defValue: Boolean): SharedPreferenceLiveData<Boolean> {
        return SharedPreferenceBooleanLiveData(this, key, defValue)
    }
    
    fun SharedPreferences.floatLiveData(key: String, defValue: Float): SharedPreferenceLiveData<Float> {
        return SharedPreferenceFloatLiveData(this, key, defValue)
    }
    
    fun SharedPreferences.longLiveData(key: String, defValue: Long): SharedPreferenceLiveData<Long> {
        return SharedPreferenceLongLiveData(this, key, defValue)
    }
    
    fun SharedPreferences.stringSetLiveData(key: String, defValue: Set<String>): SharedPreferenceLiveData<Set<String>> {
        return SharedPreferenceStringSetLiveData(this, key, defValue)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      相关资源
      最近更新 更多