Firebase Remote Config: No se puede leer ningún valor, pero la búsqueda tiene éxito

Estoy tratando de tener un parámetro de configuración remoto usando la nueva característica de configuración remota de Firebase, y estoy teniendo un problema.

Aquí está mi consola de configuración remota: Consola de configuración remota

Estoy haciendo una búsqueda y una actualización en onCreate() mi aplicación 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(); } } }); 

Y he aquí cómo lo estoy leyendo:

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

El valor está devolviendo null.

Si llamo a remoteConfig.getInfo().getLastFetchStatus() , devuelve LAST_FETCH_STATUS_SUCCESS , por lo que parece que la búsqueda está pasando con éxito.

¿Alguna idea de por qué mi valor está en blanco?

Solución encontrada! Vea abajo

Estoy corriendo en la "conclusión silenciosa" cosa – llamo "buscar", pero onComplete, onSuccess, o onFailure oyentes nunca disparar. He intentado moverlo a una actividad onCreate, y todavía no sucedió nada, y por lo tanto, los elementos de configuración nunca se cargan desde el servidor. Tengo activado el modo Desarrollador y llamo a buscar con un valor de caché de 0.

Fui capaz de (una vez) poner un punto de interrupción en la línea "public void onComplete (@NonNull Tarea tarea) {", que se golpeó, y luego pude pasar y el onComplete despedido. Yo era entonces incapaz de reproducir este mismo resultado de otra manera, incluyendo hacer lo mismo (creo) una segunda vez.

Parece un problema de tiempo o concurrencia, pero eso tiene poco sentido, dado que se trata de una llamada asincrónica.

Solución

Si obtiene de Activity # onResume (o, supongo, Activity # onStart), funciona perfectamente. Llamar buscar de Actividad # onCreate o Application # onCreate resultados en una llamada que aparentemente nunca se maneja, y de hecho, el rendimiento de la aplicación se degrada notablemente después de la búsqueda comienza, por lo que creo que hay un looper en ejecución o algo así. *

Solución # 2

Si realmente quieres que esto se ejecute desde la aplicación # onCreate (lo que hago), esto parece funcionar también:

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

Es probable que pulse el almacenamiento en caché en Configuración remota. La forma en que funciona es que Config almacenará los elementos entrantes localmente y los devolverá. Por lo tanto, su último estado de búsqueda (en caché) probablemente fue antes de que se definiera el valor, y obtendremos un valor en blanco en caché.

Puede controlar la caducidad de la memoria caché, pero si la recibe con demasiada frecuencia se arriesga a que se estrangulen.

Debido a que se trata de un problema de desarrollo común, hay un modo de desarrollador que le permite solicitar más rápidamente (para grupos pequeños de usuarios):

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

Cuando llame a fetch , puede pasar un tiempo corto de expiración del caché

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

Así es como se hace en la muestra quickstart si desea una referencia completa.

Encontré el problema.

Después de agregar un poco de registro, encontré que el onComplete() la búsqueda del trabajo nunca fue llamado. onCreate la onCreate de onCreate de mi aplicación a un fragmento, y ahora funciona correctamente!

( Ian Barber , esto podría ser algo para buscar o aclarar, ya que los registros indicaron que Firebase se inicializó sin un problema cuando estaba en la aplicación, y los fetches eran silenciosos.

He utilizado un código similar como @Ian Barber (copia):

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

Mi problema era el "BuildConfig.DEBUG" , devuelve false. Así que toma el valor 1h en la caché hasta que fue recuperado de nuevo!

La primera cosa en tal caso es comprobar si usted tiene la configuración firebase correcta y usted está conectado a firebase. Si usted tiene el estudio 2.2 de androide conseguido a Herramientas-> Firebase-> RemoteConfig – Conecte a Firebase y vea si usted consigue una notificación que dice conectada. Una vez conectado haga lo siguiente en su código: 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); 

Y luego para buscar la configuración hacer el siguiente cacheExpiration largo = 2000; // Puede aumentar esto usualmente 12hrs es lo que se recomienda

  /** 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(); } }); 

Ejecute su aplicación y compruebe los registros "Firebase Remote config Fetch Succeeded". Si ves lo mismo, tus configuraciones remotas se cargan y activan.

Tuve el mismo problema y no soluciones fueron útiles en mi caso. El problema estaba en el dispositivo de prueba. Utilicé el emulador sin instalar Google Mobile Services, debido a esto el evento completo no se disparó. He probado mi teléfono con GMS y todo funcionó muy bien. Buena suerte.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.