7

我正在使用 Firebase 远程配置来获取远程数据,并且我的应用需要从第一次启动时获得的最新数据。

我正在我的应用程序中进行获取和更新onCreate()

mFirebaseRemoteConfig.fetch(cacheExpiration)
    .addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            if (task.isSuccessful()) {
                mFirebaseRemoteConfig.activateFetched();
            }
        }
    });

并读取值:

myValue = mFirebaseRemoteConfig.getBoolean(Constants.FIREBASE_REMOTE_MY_VALUE);
  1. 第一次获取运行良好(activateFetched()成功触发),但它返回remote_config_defaults值而不是发布的远程配置。
  2. 第二次获取,即使是几秒钟后,也会返回远程值。
  3. 之后,以下提取受 cacheExpiration 规则的约束(完全可以)。

知道为什么在第一次调用时没有获取我的远程值吗?

4

4 回答 4

7

听起来您忽略了获取远程参数的异步性质。在onComplete()向 Firebase 服务器发送请求并收到回复后触发回调。这将需要几分之一秒,也许更多。

如果您的声明使用获取的值:

myValue = mFirebaseRemoteConfig.getBoolean(Constants.FIREBASE_REMOTE_MY_VALUE);

跟随调用fetch()并且不在onComplete()回调中,它将在接收到配置数据之前执行。第二次调用似乎只起作用,因为第一次调用已经过去了足够的时间来完成并且它获取和激活的数据存在。

于 2017-02-19T15:47:37.880 回答
3

Firebase 远程配置的回调是这样设计的,它会首先返回缓存的值。如果服务器没有保存缓存值,它将返回默认值中定义的值并触发远程获取。下次它返回时,如果它设法保存它们,它将返回从服务器获取的值。

Firebase Remote Config 决定一个值的方式可以描述如下:

首先,它检查是否有从服务器存储的缓存值,如果有,它将在第一次调用时返回该值。

如果没有缓存值,它会查找以编程方式或在默认文件中定义的默认值。(当您调用 setDefaults() 时)

如果没有从服务器缓存的值,并且默认值中没有值,它将使用该类型的系统默认值。

更多信息可以在这里找到:https ://firebase.google.com/docs/remote-config/ Firebase 远程配置默认值

于 2017-02-19T14:44:08.330 回答
3

就像@Bob Snyder 指出的那样,这是因为 firebase 的异步特性。

所以onCompleteListener像这样使用来解决这个问题:

firebaseRemoteConfig.activate().addOnCompleteListener {
    //logic to check the remote value
}
于 2020-08-05T11:16:09.693 回答
1

从 Android 设备获取 RemoteConfig 时遇到的一个问题是我们最初使用的是该方法

fetch()

这给了我们同样的问题,即初始值始终与默认值相同。将此更改为

fetchAndActivate()

为我们解决了这个问题。我认为不同之处在于 Firebase 允许您获取数据但不能立即“激活”它,如果您想根据默认值立即采取一些行动,然后激活远程值和之后的任何逻辑,这可能会很有帮助点将基于远程值。

希望这可以帮助某人:)

于 2019-06-19T20:16:10.363 回答