FirebaseRemoteConfig.fetch () ne déclenche pas OnCompleteListener à chaque fois

j'essaie d'implémenter la configuration à distance de Firebase:

override fun onCreate(savedInstanceState: Bundle?) {

    val configSettings = FirebaseRemoteConfigSettings.Builder().setDeveloperModeEnabled(BuildConfig.DEBUG).build()

    mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance()
    mFirebaseRemoteConfig.setConfigSettings(configSettings)
    mFirebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults)
    fetchRemoteConfig()
}

private fun fetchRemoteConfig() {
    var cacheExpiration = 3600L
    if (mFirebaseRemoteConfig.info.configSettings.isDeveloperModeEnabled) {
        cacheExpiration = 0L
    }

    mFirebaseRemoteConfig.fetch(cacheExpiration)
        .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    Log.d(TAG, "Remote config fetch succeeded")
                    mFirebaseRemoteConfig.activateFetched()
                } else {
                    Log.d(TAG, "Remote config fetch failed - ${task.exception?.message}")
                }

                setupView()
            }
}

private fun setupView() {
    val text = mFirebaseRemoteConfig.getString("my_text")
    //...
}

mon problème est que L'OnCompleteListener n'est pas toujours appelé. Si je ferme / ouvre mon application plusieurs fois, le setupView() n'est pas toujours déclenché.

L'OnCompleteListener doit toujours être appelé n'est-ce pas? Même si je touche cache?

EDIT: même si je désactive le mode developper, le comportement est le même. Parfois, le rappel est déclenché, parfois pas.

26
demandé sur guillaume 2016-05-28 19:00:57

4 réponses

je faisais face au même problème et j'ai contacté le support de la base de feu. Ils m'ont répondu le suivant:

il y a actuellement un bug qui a été signalé où onComplete, onSuccess, et onfailure listeners ne sont pas appelés si fetch() est appelé trop tôt. [...] Actuellement il y a un travail autour duquel vous pouvez placer le fetch() à l'intérieur d'un potresume. Vous pouvez essayer de l'utiliser dans l'intervalle avant qu'une solution n'ait été libérée.

j'ai mis en place le contournez en conséquence

protected void onPostResume() {
    super.onPostResume();

    mFirebaseRemoteConfig.fetch(cacheExpiration)
            .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    Log.d(TAG, "Fetch Succeeded");
                    // Once the config is successfully fetched it must be activated before newly fetched values are returned.
                    mFirebaseRemoteConfig.activateFetched();
                    // Do whatever should be done on success
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception exception) {
                    Log.d(TAG, "Fetch failed");
                    // Do whatever should be done on failure
                }
            });
}

Jusqu'à présent, il semble que la solution de rechange proposée ait résolu le problème.

mise à jour:

je viens de recevoir un avis du support de la base. Selon eux, le problème est résolu avec la dernière mise à jour des services Google Play.

un correctif à la configuration à distance n'appelant pas les auditeurs après fetching a été publié dans la dernière mise à jour des services Google play. Je vais clore cette affaire pour l'instant. Toutefois, si vous êtes continuez à rencontrer des problèmes, n'hésitez pas à tendre la main et laissez-moi savoir.

26
répondu Max 2016-08-08 09:22:36

si votre appareil exécute un ancien service Google Play et une version incompatible, vous devriez voir dans les logs:

GooglePlayServicesUtil: Google Play services obsolète. Nécessite 11020000 mais trouvé 10930470

une solution consiste à mettre à jour les services Google Play de votre appareil, mais si vous ne le pouvez pas, vous pouvez aussi simplement déclasser la version firebase pour correspondre à la version attendue (ici changer 11.0.2 à 10.9.3). Pas idéal, mais tout de même une solution si vous ne pouvez pas mettre à niveau votre appareil (par exemple le simulateur tourne 10.9.3 à partir d'aujourd'hui):

compile 'com.google.firebase:firebase-core:10.2.6'
compile 'com.google.firebase:firebase-messaging:10.2.6'
compile 'com.google.firebase:firebase-config:10.2.6'
2
répondu bagage 2017-07-06 13:22:43
Handler.postDelayed() pour retarder le timing du fetch. Pour notre équipe, il a augmenté les chances de la méthode fetch fonctionne correctement. Bien sûr, cette solution ne fonctionne pas de manière fiable, tout comme l'appel à fetch onPostResume.

@Override
public void onPostResume() {
   new Handler().postDelayed(new Runnable() {
      @Override
      public void run() {
         mFirebaseRemoteConfig.fetch(cacheExpiration)...
         ...
      }
   }, 500L);
}
1
répondu shaunkawano 2016-07-21 06:33:02

UPDATE la version 9.2.0 de firebase fonctionne comme prévu et ce hack n'est plus nécessaire.

j'ai obtenu ce "travail" fiable... mais si vous n'aimez pas ma solution. Pour que la config fetch puisse se produire quand firebase est prête, j'ai dû faire ceci:

FirebaseAuth.getInstance()
   // I don't actually want to or need to sign in..(and this actually throws an error for us.. but we ignore it)
  .signInAnonymously()
  // when it completes (error or no error) we can do our business
  .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
      @Override
      public void onComplete(@NonNull Task<AuthResult> task) {
        // do the remote config fetch you were doing before
        remoteConfig.fetch(...).addOnComplete(...);
      }
  });

ceci garantit que les internes de la base de feu sont prêts à faire ce premier fetch de configuration... sur la première application ouverte cela semble prendre environ 6-10 secondes sur mon dispositif de test merdique (toute la chose y compris l'authentification et de configuration d'extraction). Lors des ouvertures subséquentes, l'ensemble prend de 2 à 5 secondes. Évidemment, tout cela est arbitraire en fonction de l'appareil / réseau et YMMV.

j'aimerais savoir pourquoi cela est nécessaire.. il semble que remote config devrait être capable de gérer cela en interne et de ne pas l'exposer à nous.

p.s. vous aurez besoin de cette dépendance en plus de la firebase-config

compile 'com.google.firebase:firebase-auth:9.0.1'

-2
répondu danb 2016-07-01 19:18:27