【问题标题】:Unity Firebase SetCurrentScreen must be called from Main ThreadUnity Firebase SetCurrentScreen 必须从主线程调用
【发布时间】:2017-05-23 13:04:26
【问题描述】:

这很奇怪,我曾经为我的 Unity 项目做 GoogleAnalytics,因为我有两个主要用途,一是查看屏幕上的用户数量,二是查看某些事件。我听说过 Firebase 并想探索它,我成功地初始化了 sdk 并记录了不同的事件,但现在有一个我似乎无法克服的主要问题。显然,当我尝试使用以下方式记录当前屏幕时:

Firebase.Analytics.FirebaseAnalytics.SetCurrentScreen ("MainActivity", "MainMenu");

然后在某处阅读以像这样使用它:

FirebaseAnalytics.SetCurrentScreen ("MainActivity", "MainMenu");

在 Monitor(ddms) 中查看时,这两个函数都给出了相同的错误

SetCurrentScreen must be called from Main Thread

每次我调用这个出现的函数时,我都不知道为什么会发生这种情况,也无法在任何地方找到解决方案。

调用方法的函数是:

public void AnalyticsLogScreen() {
    // Log an event with a float.
    DebugLog("Logging a Screen");
    Firebase.Analytics.FirebaseAnalytics.SetCurrentScreen ("MainActivity", "MainMenu");

}

【问题讨论】:

  • 您的 Firebase 插件版本是多少?这曾经是一个错误。另外,你是从另一个线程调用 SetCurrentScreen 吗?
  • 我在 Unity 5.5.1f1 上,firebase 是 3.0.3,我只在点击时调用一个设置屏幕的函数
  • 3.0.3 似乎是最新版本。也许这个错误又回来了。为了验证这一点,请发布调用该函数的代码并显示它们被调用的位置。只需使用您的代码在您的问题中添加编辑。也许有人可以弄清楚你做错了什么。

标签: android firebase unity3d google-analytics firebase-analytics


【解决方案1】:

您似乎正在从工作线程调用SetCurrentScreen。您可以通过查看进行调用的线程的名称或将 logcat 中的 TID 与进程 PID 进行比较来检查这一点。具有名称“main”和与应用程序 PID 匹配的 TID 的主线程。

Unity SetCurrentScreen 包装在 Java FirebaseAnalytics.setCurrentScreen() 方法上。 setCurrentScreen 只能从主线程调用。

此要求的原因是 Android 中的 Activity 只能从 UI 线程显示,并且允许来自工作线程的 SetCurrentScreen 在 UI 线程中显示的 Activity 和执行 setCurrentScreen 调用的工作线程之间产生竞争条件。为了避免这种竞争条件,Firebase 需要在 UI 线程上调用 setCurrentScreen。如果您仍然想从工作线程设置屏幕,您可以调用runOnUiThread,尽管这会产生竞争条件,因此某些事件可能归因于错误的屏幕或显示未记录在任何屏幕上。

【讨论】:

  • 感谢您的回答,虽然我理解为什么会发生这种情况,但是您提到的解决方案是针对 android 我相信,虽然我的问题是针对 Unity,但我有什么办法可以在 Unity 中做到这一点?
  • 经过一些研究,我能够在 Unity 中使用 AndroidJavaClass 对象实现你所说的,现在这产生了一些新的东西,现在错误是“不能使用相同的类和名称调用 SetCurrentScreen”
  • 此警告意味着屏幕类和名称已设置为您尝试设置的值。如果类和名称与您想要的值匹配,您可以放心地忽略此警告,它没有操作。如果您想使用相同的类和名称启动新屏幕,您应该将两者都设置为 null,然后再设置回您想要的值。这会将这对类/名称计为用户打开的附加屏幕。
【解决方案2】:

https://developers.google.com/tag-manager/android/v4/ua#send-screen-views 这是容器设置。之后您可以登录屏幕:

 Firebase.Analytics.FirebaseAnalytics.LogEvent("openScreen", "screenName", "main_screen");

标签设置:

触发器:

变量:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多