android feature Firebase Remote Config: Kann keine Werte lesen, ist aber erfolgreich



firebase remote config sample (5)

Ich habe einen ähnlichen Code wie @Ian Barber (Kopie) verwendet:

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

Mein Problem war "BuildConfig.DEBUG" , es gibt false zurück. Also nimmt es den Wert 1h im Cache, bis es wieder abgerufen wurde!

Ich versuche, einen Remote-Konfigurationsparameter mit der neuen Remote-Konfigurationsfunktion von Firebase zu verwenden, und ich habe ein Problem.

Hier ist meine Remote-Konfigurationskonsole:

Ich onCreate() einen Abruf und ein Update in der Anwendung 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();
        }
    }
});

Und hier ist, wie ich es lese:

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

Der Wert gibt null zurück.

Wenn ich remoteConfig.getInfo().getLastFetchStatus() LAST_FETCH_STATUS_SUCCESS , gibt es LAST_FETCH_STATUS_SUCCESS , so scheint es, dass der Abruf erfolgreich verläuft.

Irgendeine Idee, warum mein Wert leer ist?


Answer #1

Problemumgehung gefunden! Siehe unten

Ich stoße auf die "Silent Completion" -Ding - ich rufe "Fetch" aber OnComplete, OnSuccess oder onFailure Listener nie feuern. Ich habe versucht, es in eine Aktivität onCreate zu verschieben, und trotzdem ist nichts passiert, und deshalb werden die Konfigurationselemente niemals vom Server geladen. Ich habe den Entwicklermodus aktiviert und rufe Fetch mit einem Cache-Wert von 0 auf.

Ich konnte (einmal) einen Haltepunkt auf die Zeile "public void onComplete (@NonNull Task task) {" setzen, der getroffen wurde, und dann konnte ich durchgehen und die onComplete feuern. Ich war dann nicht in der Lage, das gleiche Ergebnis auf eine andere Art und Weise zu reproduzieren, einschließlich das gleiche zu tun (denke ich) ein zweites Mal.

Scheint wie ein Timing- oder Concurrency-Problem, aber das macht wenig Sinn, da dies ein asynchroner Aufruf ist.

Problemumgehung

Wenn Sie von Activity # onResume (oder, ich vermute, Activity # onStart) abrufen, funktioniert es perfekt. Der Abruf von Activity # onCreate oder Application # onCreate führt zu einem Aufruf, der anscheinend nie behandelt wird, und tatsächlich verschlechtert sich die Leistung der App merklich, nachdem der Abruf beginnt, also denke ich, dass ein Looper läuft oder so etwas. *

Problemumgehung # 2

Wenn Sie möchten, dass dies von Application # onCreate (was ich tue) ausgeführt wird, scheint dies auch zu funktionieren:

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

Answer #2

Die erste Sache in diesem Fall ist zu überprüfen, ob Sie die richtige Firebase-Konfiguration haben und Sie mit Firebase verbunden sind. Wenn Sie android Studio 2.2 haben, gehen Sie zu Extras-> Firebase-> RemoteConfig - Verbinden Sie sich mit Firebase und sehen Sie, wenn Sie eine Benachrichtigung erhalten, dass verbunden. Sobald Sie verbunden sind, machen Sie Folgendes in Ihrem Code: 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);

Und dann zum Abrufen von Config den folgenden langen CacheExpiration = 2000; // Kann dies in der Regel 12 Stunden erhöhen, was empfohlen wird

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

Führen Sie Ihre App aus und überprüfen Sie die Protokolle "Firebase Remote config Fetch Succeeded". Wenn Sie dasselbe sehen, werden Ihre Remote-Konfigurationen geladen und aktiviert.


Answer #3

Ich hatte das gleiche Problem und keine Problemumgehungen waren in meinem Fall hilfreich. Das Problem lag im Testgerät. Ich habe Emulator verwendet, ohne Google Mobile Services zu installieren. Aus diesem Grund wurde das Complete-Ereignis nicht ausgelöst. Ich habe mein Handy mit GMS ausprobiert und alles hat super funktioniert. Viel Glück.


Answer #4

Sie treffen wahrscheinlich das caching in Remote Config. Die Funktionsweise besteht darin, dass Config eingehende Elemente lokal zwischenspeichert und zurückgibt. Daher war der letzte (zwischengespeicherte) Abrufstatus wahrscheinlich, bevor der Wert definiert wurde, und wir erhalten einen zwischengespeicherten leeren Wert.

Sie können den Cacheablauf steuern, aber wenn Sie zu oft abrufen, riskieren Sie, gedrosselt zu werden.

Da dies jedoch ein häufiges Entwicklungsproblem ist, gibt es einen Entwicklermodus, mit dem Sie schneller (für kleine Benutzergruppen) eine Anfrage stellen können:

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

Wenn Sie fetch aufrufen, können Sie eine kurze Cache-Ablaufzeit übergeben

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

So ist es im Schnellstart-Beispiel, wenn Sie eine vollständige Referenz benötigen .