为什么FirebaseRemoteConfig.fetch不会调用其回调?

and*_*per 8 android firebase firebase-remote-config

背景

我尝试使用Google的新Firebase服务进行A/B测试.为此,我们需要同时使用Firebase Analytics和Firebase RemoteConfig.

问题

使用FireBase RemoteConfig,我想从服务器获取变量(每个实验的每个变体具有不同的值),但似乎在某些设备上它被卡在那里,而不是调用它的回调(OnCompleteListener.onComplete).

我使用了与示例相同的代码(这里):

    // init:
    boolean isDebug = ... ;
    mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
    FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder().setDeveloperModeEnabled(isDebug).build();
    mFirebaseRemoteConfig.setConfigSettings(configSettings);
    final HashMap<String, Object> defaults = new HashMap<>();
    for (...)
        defaults.put(...);
    mFirebaseRemoteConfig.setDefaults(defaults);

    //fetching the variables:
    long cacheExpiration = isDebug ? 0 : java.util.concurrent.TimeUnit.HOURS.toSeconds(1);
    mFirebaseRemoteConfig.fetch(cacheExpiration).addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            //on some devices, I never get here at all
            if (task.isSuccessful()) {
                mFirebaseRemoteConfig.activateFetched();
                final FirebaseAnalytics firebaseAnalytics = FirebaseAnalytics.getInstance(context);
                for (...) {
                    String experimentVariantValue = mFirebaseRemoteConfig.getString(...);
                    firebaseAnalytics.setUserProperty(..., experimentVariantValue);
                }
            } else {
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

事实是,回调不会被调用,但仅限于某些设备:

  • Nexus 5与Android 6.0.1:几乎总是成功.
  • 带有Android 5.1.1的Nexus 4和带有Android 4.2.2的LG G2:几乎总是冻结(意味着它们不会进入回调)

我还发现,当它确实有效时,它会在之后的近会话中起作用.

这个问题

它为什么会发生?我该怎么做才能解决这个问题?

Cac*_*apa 0

根据这个答案,这似乎是 Firebase 初始化代码中的某种竞争条件: /sf/answers/2636546251/

我尝试了相当多的已发布的解决方法,但没有一个工作足够可靠,令我满意。不过 Firebase 开发人员似乎已经意识到了这个问题,所以这个问题可能很快就会得到解决。