Firebase Remote Config: не может читать значения, но выборка выполнена успешно

Я пытаюсь иметь параметр удаленной конфигурации, используя новую функцию Remote Config для Firebase, и у меня возникла проблема.

Вот моя консоль Remote Config: Удаленная консоль конфигурации

Я делаю выборку и обновление в своем приложении 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(); } } }); 

И вот как я его читаю:

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

Значение возвращает null.

Если я вызываю remoteConfig.getInfo().getLastFetchStatus() , он возвращает LAST_FETCH_STATUS_SUCCESS , поэтому кажется, что выборка прошла успешно.

Любая идея, почему мое значение пустое?

Обходное решение найдено! Смотри ниже

Я сталкиваюсь с «молчаливым завершением» – я называю «извлечения», но onComplete, onSuccess или onFailure слушатели никогда не срабатывают. Я попытался переместить его в действие onCreate, и все равно ничего не произошло, поэтому элементы конфигурации никогда не загружаются с сервера. У меня включен режим разработки, и я вызываю fetch с кешем в 0.

Я смог (однажды) поставить точку останова на строке «public void onComplete (задача @NonNull Task) {«, которая попала, а затем я смог пройти, и onComplete был запущен. Тогда я не смог воспроизвести этот же результат любым другим способом, в том числе сделать то же самое (я думаю) во второй раз.

Похоже на проблему с синхронизацией или параллелизмом, но это мало смысла, учитывая, что это асинхронный вызов.

Временное решение

Если вы выберете из Activity # onResume (или, я полагаю, Activity # onStart), он отлично работает. Вызов fetch из Activity # onCreate или Application # onCreate приводит к вызову, который, казалось бы, никогда не обрабатывается, и, по сути, производительность приложения заметно ухудшается после начала выборки, поэтому я думаю, что работает петлитель или что-то в этом роде. *

Обходной путь №2

Если вы действительно хотите, чтобы это запускалось из Application # onCreate (что я и делаю), это, похоже, тоже работает:

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

Вероятно, вы попадаете в кеширование в Remote Config. Способ, которым он работает, заключается в том, что Config будет кэшировать входящие элементы локально и возвращать их. Таким образом, ваш последний (кэшированный) статус выборки, вероятно, был до того, как значение было определено, и мы получим кешированное пустое значение.

Вы можете контролировать срок действия кеша, но если вы слишком часто выбираете, вы рискуете получить дросселирование.

Поскольку это общая проблема разработки, есть режим разработчика, который позволяет быстрее запрашивать (для небольших групп пользователей):

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

Когда вы вызываете fetch вы можете передать короткий срок действия кеша

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

Вот как это делается в примере быстрого запуска, если вы хотите получить полную ссылку.

Нашел проблему.

После добавления некоторого ведения журнала я обнаружил, что onComplete() никогда не вызывается. Я переместил извлечение из моего приложения onCreate в фрагмент, и теперь он работает правильно!

( Ian Barber , это может быть что-то, что нужно изучить или уточнить, так как в журналах указано, что Firebase была инициализирована без проблем, когда она была в приложении, а в записях были тихие сбои.)

Я использовал такой же код, как @Ian Barber (копия):

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

Моя проблема была «BuildConfig.DEBUG» , она возвращает false. Поэтому он берет значение 1h в кеше, пока он не будет снова получен!

Первое, что в таком случае, это проверить, есть ли у вас правильная конфигурация firebase, и вы подключены к firebase. Если у вас есть Android 2.2, вы попали в Tools-> Firebase-> RemoteConfig – подключитесь к Firebase и посмотрите, есть ли уведомление, связанное с подключением. После подключения выполните следующие действия в своем коде: 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); 

А затем для настройки конфигурации выполните следующий длинный cacheExpiration = 2000; // Может увеличиться, обычно 12 часов – это то, что рекомендуется

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

Запустите приложение и проверьте журналы «Firebase Remote config Fetch Succeeded». Если вы видите, что ваши удаленные конфигурации загружены и активированы.

У меня была такая же проблема, и никакие обходные пути не помогли в моем случае. Проблема была в тестирующем устройстве. Я использовал эмулятор без установки Google Mobile Services, потому что это событие не было запущено. Я попробовал свой телефон с GMS, и все отлично поработало. Удачи.

Intereting Posts
Android: как отключить AsyncTask до того, как я вызову другой метод? Каков правильный путь к объектной ориентации Android-программы? Как ограничить автозаполнение google местами в конкретной стране? Метка Размер текста в соответствии с размером экрана в круговой диаграмме движка диаграммы в android Чтение массива Json в андроиде Реагировать на родной мир приветствия Android-Как сделать видео с помощью набора изображений с SD-карты? Какие методы вызывают в жизненном цикле деятельности в следующих случаях: Как назначить ручные ярлыки в Eclipse (Android и Java) Любой Android-разработчик никогда не сталкивался с подобным визуальным статичным? (См. Рисунок) Новый SDK Google Analytics 4 AdMob – лучшая производительность в андроидной активности Отладка React Native over adb tcpip Возвращает ли Fragment.getArguments () аргументы после изменения конфигурации? Scrollview выходит за пределы экрана