49 votes

Firebase Remote Config : Impossible de lire les valeurs, mais la récupération est réussie.

J'essaie d'avoir un paramètre de configuration à distance en utilisant la nouvelle fonctionnalité de configuration à distance de Firebase, et j'ai un problème.

Voici ma console de configuration à distance : remote config console

J'effectue une recherche et une mise à jour dans l'application onCreate() :

final FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.getInstance();
remoteConfig.fetch().addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        if (task.isSuccessful()) {
            remoteConfig.activateFetched();
        }
    }
});

Et voici comment je le lis :

FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.getInstance();
String value = remoteConfig.getString("active_subscriptions");

La valeur renvoie null.

Si j'appelle remoteConfig.getInfo().getLastFetchStatus() il renvoie LAST_FETCH_STATUS_SUCCESS donc il semble que la récupération se passe bien.

Une idée de la raison pour laquelle ma valeur est vide ?

0 votes

Steven, voir mon commentaire ci-dessous - J'ai essayé ta solution, et ça n'a pas marché pour moi, mais j'ai réussi à la faire fonctionner en déplaçant le fetch hors de onCreate.

0 votes

J'ai le même problème et déplacer la récupération hors de onCreate ne fonctionne pas pour moi si je le déplace dans onResume, il fonctionnera sur un deuxième onResume mais pas le onResume initial. Ce n'est pas vraiment l'idéal car je veux configurer certains aspects de mon application à distance dès le premier lancement, et non "à un moment ultérieur" :(

0 votes

19voto

jkane001 Points 964

Solution trouvée ! Voir ci-dessous

Je rencontre le problème de l'achèvement silencieux : j'appelle "fetch" mais les listeners onComplete, onSuccess ou onFailure ne se déclenchent jamais. J'ai essayé de le déplacer vers une activité onCreate, mais rien ne s'est produit et, par conséquent, les éléments de configuration ne sont jamais chargés depuis le serveur. J'ai activé le mode développeur et j'appelle fetch avec une valeur de cache de 0.

J'ai pu (une fois) placer un point d'arrêt sur la ligne "public void onComplete(@NonNull Task task) {", qui a été atteinte, puis j'ai pu passer à travers et le onComplete s'est déclenché. J'ai ensuite été incapable de reproduire ce même résultat d'une autre manière, y compris en faisant la même chose (je pense) une deuxième fois.

Cela semble être un problème de synchronisation ou de concurrence, mais cela n'a guère de sens, étant donné qu'il s'agit d'un appel asynchrone.

Solution de rechange

Si vous récupérez à partir de Activity#onResume (ou, je présume, Activity#onStart), cela fonctionne parfaitement. Si vous appelez fetch à partir de Activity#onCreate ou de Application#onCreate, vous obtenez un appel qui ne semble jamais être traité, et en fait, les performances de l'application se dégradent sensiblement après le début de la récupération, donc je pense qu'il y a une boucle qui tourne ou quelque chose comme ça.

Solution n° 2

Si vous voulez vraiment que cela soit exécuté à partir d'Application#onCreate (ce que je fais), cela semble fonctionner également :

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        // Run mFirebaseRemoteConfig.fetch(timeout) here, and it works
    }
}, 0);

1 votes

J'ai également eu ce problème et un handler (#2) a permis à config fetch de fonctionner correctement. Très étrange.

2 votes

Récemment (j'utilise maintenant Firebase 9.0.1), le code que j'utilise dans la solution 2 ne fonctionne plus pour moi (et le bug existe toujours). Il semble donc que la solution 1 soit la seule solution valable à présent.

0 votes

Cela a réglé le problème pour moi. J'exécute le mien dans un DialogFragment. J'ai essayé de le déplacer de onViewCreated à onResume, mais ça ne fonctionnait toujours pas. Une fois que j'ai ajouté le Handler.post(Runnable), l'appel de récupération a commencé à fonctionner correctement.

19voto

Ian Barber Points 2553

Vous êtes probablement en train de frapper le mise en cache dans Remote Config. Le principe de fonctionnement est le suivant : Config met en cache localement les éléments entrants et les renvoie. Ainsi, votre dernier état de récupération (en cache) était probablement antérieur à la définition de la valeur, et nous obtenons une valeur vide en cache.

Vous pouvez contrôler l'expiration du cache, mais si vous récupérez trop souvent, vous risquez d'être limité.

Cependant, comme il s'agit d'un problème de développement courant, il existe un mode développeur qui vous permet de demander plus rapidement (pour de petits groupes d'utilisateurs) :

FirebaseRemoteConfigSettings configSettings = 
    new FirebaseRemoteConfigSettings.Builder()
        .setDeveloperModeEnabled(BuildConfig.DEBUG)
        .build();
FirebaseRemoteConfig.getInstance().setConfigSettings(configSettings);

Lorsque vous appelez fetch vous pouvez alors passer un court délai d'expiration du cache

long cacheExpiration = 3600;
FirebaseRemoteConfig mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
if (mFirebaseRemoteConfig.getInfo().getConfigSettings().isDeveloperModeEnabled()) {
     cacheExpiration = 0;
}
mFirebaseRemoteConfig.fetch(cacheExpiration)
     .addOnCompleteListener(new OnCompleteListener<Void>() {
     // ...
});

C'est comme ça que ça se passe dans le échantillon de démarrage rapide si vous voulez une référence complète.

10 votes

Malheureusement, cela n'a rien changé.

2 votes

Cela semble être un problème différent. Je peux confirmer en utilisant gFirebaseRemoteConfig.getInfo() que fetch n'est jamais revenu, donc ce n'est pas un problème de cache.

0 votes

La recherche sur onCreate() est ok et il n'y a pas besoin de les mettre en onStart() . Les seules choses que vous devez faire sont d'activer le mode de développement et de passer moins de secondes (c'est-à-dire 100) à la méthode de récupération. Cela fonctionne très bien. Merci

12voto

D_Steve595 Points 959

J'ai trouvé le problème.

Après avoir ajouté quelques journaux, j'ai découvert que le fichier de la tâche de récupération onComplete() n'a jamais été appelé. J'ai déplacé l'appel de mon application. onCreate à celui d'un fragment, et maintenant cela fonctionne correctement !

( Ian Barber En effet, les journaux indiquent que Firebase a été initialisé sans problème lorsqu'il se trouvait dans l'application, et que les extractions étaient des échecs silencieux).

0 votes

Que faire si vous avez besoin d'utiliser un fragment ?

0 votes

J'utilise un fragment. Déplacer le fetch() dans le fragment l'a réparé pour moi.

0 votes

C'est intéressant, nous allons examiner cette question. Merci pour vos commentaires !

5voto

J'ai eu le même problème et aucune solution de contournement n'a été utile dans mon cas. Le problème se situait au niveau de l'appareil de test. J'ai utilisé l'émulateur sans installer les services mobiles de Google, ce qui fait que l'événement Complete n'a pas été déclenché. J'ai essayé mon téléphone avec GMS et tout a bien fonctionné. Bonne chance.

2voto

Raheel Shah Points 166

La première chose à faire dans ce cas est de vérifier que vous avez la bonne configuration de Firebase et que vous êtes connecté à Firebase. Si vous avez Android Studio 2.2, allez dans Outils->Firebase->RemoteConfig - Connecter à Firebase et voyez si vous recevez une notification disant que vous êtes connecté : mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance() ;

    /** NOTE: At this point, your app can use in-app default parameter values.To use in-app
     *        default values,skip the next section. You can deploy your app without setting
     *        parameter values on the server,and then later set values on the server to
     *        override the default behavior and appearance of your app.
     */

    mFirebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults);
    FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder()
            .setDeveloperModeEnabled(true)
            .build();
    mFirebaseRemoteConfig.setConfigSettings(configSettings);

Et ensuite, pour récupérer la configuration, faites ce qui suit long cacheExpiration = 2000 ; // Vous pouvez augmenter cette durée, habituellement 12 heures est ce qui est recommandé.

    /** If in developer mode cacheExpiration is set to 0 so each fetch will retrieve values from
     * the server.*/

    if (mFirebaseRemoteConfig.getInfo().getConfigSettings().isDeveloperModeEnabled()) {
        cacheExpiration = 0;
    }

   /**  cacheExpirationSeconds is set to cacheExpiration here, indicating that any previously
    * fetched and cached config would be considered expired because it would have been fetched
    * more than cacheExpiration seconds ago. Thus the next fetch would go to the server unless
    * throttling is in progress. The default expiration duration is 43200 (12 hours).
    */

    mFirebaseRemoteConfig.fetch(cacheExpiration)//TODO Bring this from a config file
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "Firebase Remote config Fetch Succeeded");
                        // Once the config is successfully fetched it must be activated before newly fetched
                        // values are returned.
                        mFirebaseRemoteConfig.activateFetched();
                    } else {
                        Log.d(TAG, "Firebase Remote config Fetch failed");
                    }
                    showRemoteConfig();
                }
            });

Exécutez votre application et vérifiez dans les logs " Firebase Remote config Fetch Succeeded ". Si vous voyez la même chose, vos configurations distantes sont chargées et activées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X