Firebase远程配置:无法读取任何值,但获取成功

Ste*_*oen 38 android firebase firebase-remote-config

我正在尝试使用Firebase的新远程配置功能来获取远程配置参数,我遇到了问题.

这是我的远程配置控制台: 远程配置控制台

我正在我的应用程序中进行获取和更新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();
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

这就是我读它的方式:

FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.getInstance();
String value = remoteConfig.getString("active_subscriptions");
Run Code Online (Sandbox Code Playgroud)

值返回null.

如果我打电话remoteConfig.getInfo().getLastFetchStatus(),它会返回LAST_FETCH_STATUS_SUCCESS,所以看起来fetch成功了.

知道为什么我的价值是空白的吗?

jka*_*001 18

找到解决方法!见下文

我正在遇到"无声完成"的事情 - 我称之为"fetch",但onComplete,onSuccess或onFailure监听器从不会触发.我尝试将它移动到onCreate上的活动,但仍然没有发生任何事情,因此配置项永远不会从服务器加载.我启用了Developer Mode,并且调用fetch时缓存值为0.

我能够(曾经)在"public void onComplete(@NonNull Task task){"这一行上设置一个断点,它被击中,然后我能够逐步完成并触发onComplete.然后,我无法以任何其他方式重现同样的结果,包括第二次做同样的事情(我想).

看起来像是时间或并发问题,但这没什么意义,因为这是一个异步调用.

解决方法

如果你从Activity#onResume(或者我认为是Activity#onStart)中获取它,它可以很好地工作.从Activity#onCreate或Application#onCreate调用fetch会导致看似永远不会被处理的调用,事实上,在获取开始后,应用程序的性能会明显降低,因此我认为有一个looper正在运行或者其他什么.*

解决方法#2

如果你真的希望从Application#onCreate(我这样做)运行它,这似乎也有效:

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

  • 尝试了两种解决方法,都行不通! (2认同)
  • 最近(我现在使用Firebase 9.0.1),我在解决方法2中使用的代码不再适用于我(并且该bug仍然存在).因此,现在看来解决方法1是唯一有效的解决方法. (2认同)
  • 我从9.0.0版开始就使用此解决方法.版本9.4.0解决了这个问题,正在检查它. (2认同)

Ian*_*ber 17

您可能会在Remote Config中进行缓存.它的工作方式是Config将在本地缓存传入的项目,并返回它们.所以你的最后一个(缓存)获取状态可能在定义值之前,我们得到一个缓存的空白值.

您可以控制缓存过期,但如果您经常获取,则可能会受到限制.

因为这是一个常见的开发问题,所以有一种开发人员模式可以让您更快地请求(对于小型用户组):

FirebaseRemoteConfigSettings configSettings = 
    new FirebaseRemoteConfigSettings.Builder()
        .setDeveloperModeEnabled(BuildConfig.DEBUG)
        .build();
FirebaseRemoteConfig.getInstance().setConfigSettings(configSettings);
Run Code Online (Sandbox Code Playgroud)

当您通话时,fetch您可以通过短暂的缓存到期时间

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

如果你想要一个完整的参考,这就是它在快速启动样本中的完成情况.

  • 不幸的是,没有任何改变. (10认同)
  • 这似乎是一个不同的问题.我可以使用gfirebaseRemoteConfig.getInfo()确认fetch从未返回过,因此它不是缓存问题 (2认同)

Ste*_*oen 9

发现了问题.

添加一些日志记录后,我发现onComplete()从未调用过fetch job .我将我的应用程序的提取移动onCreate到片段,现在它正常工作!

(Ian Barber,这可能是要查看或澄清的内容,因为日志表明Firebase在应用程序中初始化时没有问题,并且提取是无声的失败.)


aar*_*ino 8

我也遇到了这个问题。原来我没有在 Firebase 控制台中看到“发布”按钮。:脸掌:


Vad*_*4uk 6

我遇到了同样的问题,并且没有任何解决方法对我的情况有帮助。问题出在测试设备上。我使用模拟器时未安装 Google 移动服务,因此未触发 Complete 事件。我用 GMS 尝试了我的手机,一切都很好。祝你好运。