web-dev-qa-db-fra.com

LiveData avec préférences partagées

J'ai un écran de paramètres où je règle certaines valeurs. Lorsque je définis ces valeurs, il est enregistré dans les préférences partagées et ces valeurs sont nécessaires comme paramètres dans ma demande À l'appel de l'API réseau.

Maintenant, je peux utiliser un écouteur pour les préférences partagées dans mon activité, puis faire un appel à l'API et obtenir de nouvelles données, mais je souhaite l'utiliser avec LiveData.

Comment puis-je écouter les modifications des préférences partagées à l'aide de LiveData, puis passer l'appel réseau à l'aide des nouveaux paramètres.

3
nick.tdr

Le bon morceau de code suivant est LiveData Implementation of SharedPreference. Ça fonctionne parfaitement.

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)
}
3
Abhishek Luthra

En supposant que votre requête réseau vous fournisse déjà une classe LiveData. Par exemple, avec Retrofit et un CallAdapter comme LiveDataCallAdapter .

Une fois que vous avez la dernière valeur observée par:

  • Appliquer un écouteur pour les préférences partagées OnSharedPreferenceChangeListener, comme vous l'avez déjà mentionné, pour mettre à jour un MutableLiveData
  • Ou en utilisant un LiveData SharedPreferences comme rharter/SharedPreferenceLiveData.kt

Ensuite, vous pouvez appliquer le précédent LiveData à:

Voici l'exemple lié à Transformations.switchMap dans UserViewModel.kt :

private val _login = MutableLiveData<String>()
val login: LiveData<String>
    get() = _login
val repositories: LiveData<Resource<List<Repo>>> = Transformations
    .switchMap(_login) { login ->
        if (login == null) {
            AbsentLiveData.create()
        } else {
            repoRepository.loadRepos(login)
        }
    }
0
marioavs

je vois que votre défi consiste à appeler la valeur Préférences partagées lors de l'appel de l'API dans ViewModel ou LiveData. 

Vous pouvez définir votre préférence partagée comme globale dans la classe d’application (elle sera donc globale).

public class MyApplication extends Application {
   public static AppPreferences shared_preference;

   /*On Create Application Create AppPreferences*/
   @Override
   public void onCreate() {
     super.onCreate();
     shared_preference = AppPreferences.getInstance(this);
   }
}

Et vous pouvez mettre à jour ou enregistrer une valeur en appelant Préférence partagée dans votre ViewModel.

/*Save to Shared Preferences*/
MyApplication.shared_preference.setLogin(true);

Je souhaite que cela vous aide, car je vois votre problème là-bas, cela fonctionne pour moi et je peux insérer un paramètre dans l'API Call.