SharedPreferenceChangeListener
可以(而且确实做到了!)当db更新为相同的值时跳过通知,例如从true
到true
的boolean
值。在实践中,当值更改为不同的值时,您会收到通知。
如何获得每次SharedPreference键/值更新时的通知?
发布于 2019-01-11 15:12:31
简单而简单的解决方案是,当键/值对存在于SharedPreferences中时,对它进行。记住忽略SharedPreferenceChangeListener
中的空通知。当删除值和插入新值时,您将收到通知。
Check out preferenceManager.remove(key)
in:
open class MyBasePreferences : KoinComponent {
val context: Context by inject()
val preferenceManager: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
/**
* Saves primitive value to shared preferences
*/
fun SharedPreferences.save(key: String, value: Any?) {
if (value == null)
throw RuntimeException("Trying to save null value!")
if (preferenceManager.contains(key))
preferenceManager.remove(key)
preferenceManager.edit {
when (value) {
is String -> putString(key, value)
is Long -> putLong(key, value)
is Boolean -> putBoolean(key, value)
is Int -> putInt(key, value)
is Float -> putFloat(key, value)
else -> throw RuntimeException("Type not supported in Preferences!")
}
}
}
}
自定义SharedPrefChangeListener
class MySharedPrefChangeListener : SharedPreferences.OnSharedPreferenceChangeListener, KoinComponent {
/**
* Called when a shared preference is changed, added, or removed.
*/
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
if (sharedPreferences == null)
return
if (sharedPreferences.contains(key)) {
when (key) {
"YOUR_KEY" -> {
// action to perform
}
}
}
}
}
App类内部:
/**
* Main application class
*/
class MyApp : Application(), KoinComponent {
var preferenceManager: SharedPreferences? = null
var prefChangeListener: MySharedPrefChangeListener? = null
override fun onCreate() {
super.onCreate()
preferenceManager = PreferenceManager.getDefaultSharedPreferences(this)
prefChangeListener = MySharedPrefChangeListener()
preferenceManager?.registerOnSharedPreferenceChangeListener(prefChangeListener)
}
}
https://stackoverflow.com/questions/54149218
复制相似问题