Android 必须从主线程调用Unity Firebase SetCurrentScreen

Android 必须从主线程调用Unity Firebase SetCurrentScreen,android,firebase,unity3d,google-analytics,firebase-analytics,Android,Firebase,Unity3d,Google Analytics,Firebase Analytics,这很奇怪,我曾经为我的Unity项目做GoogleAnalytics,因为我有两个主要用途,一个是查看屏幕上的用户数量,另一个是一些事件。我听说了Firebase并想探索它,我成功地初始化了sdk并记录了不同的事件,但现在有一个主要问题我似乎无法克服。显然,当我尝试使用以下方式记录当前屏幕时: Firebase.Analytics.FirebaseAnalytics.SetCurrentScreen ("MainActivity", "MainMenu"); 然后在某个地方读到这样的用法: F

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

Firebase.Analytics.FirebaseAnalytics.SetCurrentScreen ("MainActivity", "MainMenu");
然后在某个地方读到这样的用法:

FirebaseAnalytics.SetCurrentScreen ("MainActivity", "MainMenu");
在监视器(ddms)中查看时,这两个函数给出了相同的错误

每次我调用这个函数时,我都不知道为什么会发生这种情况,也找不到解决方法

调用该方法的函数是:

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

}

看起来您是从工作线程调用的。您可以通过查看发出调用的线程的名称或比较logcat中的TID与进程PID来检查这一点。名称为“main”且TID与应用程序PID匹配的主线程

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

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

这是容器设置。之后,您可以登录屏幕:

 Firebase.Analytics.FirebaseAnalytics.LogEvent("openScreen", "screenName", "main_screen");
标记设置:

触发:

可变的:

您的Firebase插件版本是什么?这曾经是一个错误。另外,你是从另一个线程调用SetCurrentScreen吗?我在Unity 5.5.1f1上,firebase是3.0.3,我只是在单击时调用一个函数来设置screen3.0.3似乎是最新版本。也许这只虫子又回来了。为了验证这一点,请发布调用该函数的代码,并显示调用它们的位置。只需在问题中添加编辑代码。也许有人能准确地找出你做错了什么。谢谢你的回答,虽然我理解为什么会发生这种情况,但你提到的解决方案是针对android的,我相信,而我的问题是针对Unity的,在Unity中有什么方法可以做到这一点吗?经过一些研究,我能够在Unity中使用AndroidJavaClass对象实现你所说的,现在这产生了一些新的东西,现在错误是“不能使用相同的类和名称调用SetCurrentScreen”此警告表示屏幕类和名称已设置为您尝试设置的值。如果类和名称与您想要的值匹配,您可以安全地忽略此警告,它不起作用。如果您想要使用相同的类和名称启动新屏幕,您应该将两者都设置为null,然后返回到您想要的值。这将把这对类/名称计算为用户打开的附加屏幕。
 Firebase.Analytics.FirebaseAnalytics.LogEvent("openScreen", "screenName", "main_screen");