【问题标题】:Why FirebaseRemoteConfig.fetch doesn't call its callback?为什么 FirebaseRemoteConfig.fetch 不调用它的回调?
【发布时间】:2016-06-23 14:38:17
【问题描述】:

背景

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

问题

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

我使用的代码与示例 (here) 上的代码大致相同:

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

问题是,回调不会被调用,而只是在某些设备上:

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

我还发现,当它起作用时,它会在之后的近距离会话中起作用。

问题

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

【问题讨论】:

  • 我对 firebase 12.0.1 有同样的问题

标签: android firebase firebase-remote-config


【解决方案1】:

只是为了补充 Cachapa 刚刚发布的内容,当 fetch() 调用过早时会发生错误。我们找到了解决该问题的两种方法(都有效,但都不令人满意) - 从 onResume 调用 fetch(),或者在实际发出 fetch() 之前添加 3 秒延迟。

关于“它在之后的近会话中起作用”,一旦你得到回调并调用 activateFetched(),所有会话都会得到正确的值。

更新 3 秒的延迟来自 Activity.onCreate()。进一步检查后,它只能在一个设备上运行——Nexus 4。它在三星 S3 和 Moto X Pure 上都没有。 我们还检查了三星 S7,它没有任何延迟地工作——这个问题根本没有表现出来。

我们正在与 Firebase 支持的邮件通信中讨论它。当他们回复我时,我会在这里更新..

更新 2 Firebase 团队声称这已在 GPSv9.4 中解决,我认为这次他们是对的。他们还声称它已在 9.3 中解决,但后来我的测试证明了这一点。现在(将我们对 gms 的依赖更新到 v9.4 之后),我在我的开发设备上正确地获得了回调。但是,我仍然得到迹象表明并非我们所有的生产设备都获得了正确的配置。我的假设是没有将 GPS 更新到最新版本的设备仍然有故障,但我不确定..

【讨论】:

  • 关于延迟,3 秒到底是多少?你之前叫什么?初始化(setConfigSettings,setDefaults)?
  • Firebase 支持团队有没有回复您?请更新您的答案,这将是一个很好的帮助,因为我面临同样的问题。谢谢:)
【解决方案2】:

这似乎是 Firebase 初始化代码中的某种竞争条件,根据这个答案:https://stackoverflow.com/a/37664946

我尝试了很多张贴的解决方法,但没有一种方法能可靠地让我满意。不过,Firebase 开发人员似乎已经意识到了这个问题,所以这个问题可能很快就会得到解决。

【讨论】:

  • 所以这是一个已知的错误?你能显示一个更官方的链接吗?
  • 对不起,没有。有人还要求提供指向另一个线程中的错误的链接,但没有给出。我认为这是因为 Firebase 的错误跟踪器未向公众开放。
【解决方案3】:

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

我猜测回调没有被调用的原因是因为 Firebase 远程配置可能有几个问题,而这些问题还没有解决。

以下是我和我的团队迄今为止发现的可能被视为远程配置问题的列表。

以上列表是我和我的队友迄今为止发现的一些有关远程配置的问题。其中前两个来自 Google 搜索,最后一个是“调试构建和发布构建可能会影响远程配置的行为方式..?”这是我们在测试了一段时间的远程配置后观察到的,所以我们还不确定。

我不确定它是否能解决您的问题,但如果您的问题与我上面列出的第一个问题有关,由于fetch() 调用得太早,那么您可以尝试使用@ 调用fetch()我们已经尝试过 987654326@,它使 Remote Config 有更好的机会成功调用其侦听器,但总体而言,in my personal opinion, Remote Config is just not fully ready yet for production release.

【讨论】:

  • 是的,它似乎正在修复中。关于解决方法,它对我的​​情况没有帮助,但我认为在最近更新的 firebase 中它变得更加罕见。顺便说一句,您列表中的第 3 项没有链接。
  • @androiddeveloper 实际上,列表中的第 3 项不是我在互联网上搜索过的,而是我们团队认为可能的情况;这是不确定的,也不确定构建变体是否真的会产生影响,但我们发现它的行为会根据构建变体而有所不同。
猜你喜欢
  • 2018-07-31
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2015-03-09
  • 2018-11-12
  • 2021-12-07
  • 1970-01-01
相关资源
最近更新 更多