我正在使用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);
activateFetched()
已成功触发),但它返回remote_config_defaults
值,而不是已发布的远程配置。 知道为什么我的远程值没有在第一次调用时获取?
答案 0 :(得分:2)
Firebase远程配置的回调设计如此,它将首先返回缓存的值。如果没有从服务器保存的缓存值,它将返回默认值中定义的值并触发远程提取。下次返回时,如果它设法保存它们,它将从服务器返回获取的值。
Firebase远程配置决定值的方式可以描述如下:
首先,它检查是否存在从服务器存储的缓存值,如果有,则使用该缓存值并在第一次调用时返回该值。
如果没有缓存值,它将查找以编程方式或默认文件中定义的默认值。 (当你调用setDefaults())
时如果没有从服务器缓存的值,并且默认值中没有值,则它使用该类型的系统默认值。
答案 1 :(得分:2)
听起来你正在忽视获取远程参数的异步性质。向Firebase服务器发送请求并收到回复后,onComplete()
回调将触发。这将需要几分之一秒,甚至更多。
如果您的语句使用了获取的值:
myValue = mFirebaseRemoteConfig.getBoolean(Constants.FIREBASE_REMOTE_MY_VALUE);
跟随对fetch()
的调用,并且不在onComplete()
回调中,它将在收到配置数据之前执行。第二个呼叫似乎只能工作,因为第一次完成呼叫已经过了足够的时间,并且它所获取和激活的数据已经存在。
答案 2 :(得分:0)
从Android设备获取RemoteConfig时遇到的一个问题是,我们最初使用的是方法
fetch()
给我们带来了同样的问题,即初始值始终与默认值相同。更改为
fetchAndActivate()
为我们解决了该问题。我认为区别在于Firebase允许您获取数据,但不能立即“激活”数据,如果您希望基于默认值立即采取一些措施,然后激活远程值,然后再执行其后的任何逻辑,那么这可能会有所帮助点将基于远程值。
希望这对某人有帮助:)
答案 3 :(得分:0)
就像@Bob Snyder指出的,这是由于Firebase的异步特性。
因此,像这样使用onCompleteListener
来解决此问题:
firebaseRemoteConfig.activate().addOnCompleteListener {
//logic to check the remote value
}