2017-05-30 37 views
5

我们从Crashlytics获得错误报告,影响了我们用户的相当大一部分(其中约10%)。这是一个CalledFromWrongThreadException。Unity Daydream CalledFromWrongThreadException

问题是我不知道是什么导致了这个问题,我自己也没有。下面是日志:

Caused by android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
     at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7282) 
     at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1197) 
     at android.view.ViewGroup.invalidateChild(ViewGroup.java:5748) 
     at android.view.View.invalidateInternal(View.java:15082) 
     at android.view.View.invalidate(View.java:15046) 
     at android.view.View.invalidate(View.java:15029) 
     at android.view.SurfaceView$1.handleMessage(SurfaceView.java:142) 
     at android.os.Handler.dispatchMessage(Handler.java:105) 
     at android.os.Looper.loop(Looper.java:164) 
     at com.unity3d.player.UnityPlayer$c.run(Unknown Source:20) 

com.unity3d.player.UnityPlayer$c.run(Unknown Source:20)是不是真的有帮助这里的起源是未知的,我猜它可能来自第三方库(GVR SDK,布...)。

有没有人有同样的问题?

仅供参考,我们使用Unity版本:5.6.0f3,并且仅报告Pixel和Pixel XL手机的错误。

回答

0

我没有关于您的项目的所有细节,而且无法在内部复制的错误是最糟糕的一种。不过,我会试着提供一些关于发生了什么的提示。也许这些提示可以提供一些线索,帮助你找出错误的根源:

CalledFromWrongThreadException

在Android上,一个视图只能从创建它的线程访问。这对其他环境也是如此(WinFormsWPF等)。这个异常意味着某些东西试图从错误的线程访问某个UI元素(SurfaceView)。

com.unity3d.player.UnityPlayer $ c.run

堆栈跟踪从一些自定义的统一管道代码起源。虽然这并不能说明这个调用来自哪里(在C#代码中),但这可能意味着代码来自C#(使用AndroidJavaObject或AndroidJavaClass调用)。 Unity的脚本线程与Android的主线程并不相同,因此这与您获得的异常类型一起合理。

作为一个测试,我用这个代码模拟了相同的异常:

using (var actClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) 
{ 
    var activity = actClass.GetStatic<AndroidJavaObject>("currentActivity"); 

    // cause an exception to be thrown 
    activity.Call("setContentView", 15); 
} 

这导致以下异常,这是非常相似,你得到(至少在一个其根)。

E/ViewRootImpl(19244): com.test.crash.GameActivity : Only the original thread that created a view hierarchy can touch its views. E/ViewRootImpl(19244): java.lang.RuntimeException E/ViewRootImpl(19244): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7105) E/ViewRootImpl(19244): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1139) E/ViewRootImpl(19244): at android.view.ViewGroup.invalidateChild(ViewGroup.java:5254) E/ViewRootImpl(19244): at android.view.View.invalidateInternal(View.java:13669) E/ViewRootImpl(19244): at android.view.View.invalidate(View.java:13633) E/ViewRootImpl(19244): at android.view.View.onFocusChanged(View.java:6204) E/ViewRootImpl(19244): at android.view.View.clearFocusInternal(View.java:6089) E/ViewRootImpl(19244): at android.view.View.unFocus(View.java:6122) E/ViewRootImpl(19244): at android.view.ViewGroup.unFocus(ViewGroup.java:997) E/ViewRootImpl(19244): at android.view.ViewGroup.removeAllViewsInLayout(ViewGroup.java:4946) E/ViewRootImpl(19244): at android.view.ViewGroup.removeAllViews(ViewGroup.java:4905) E/ViewRootImpl(19244): at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:410) E/ViewRootImpl(19244): at android.app.Activity.setContentView(Activity.java:2423) E/ViewRootImpl(19244): at com.unity3d.player.UnityPlayer.nativeRender(Native Method) E/ViewRootImpl(19244): at com.unity3d.player.UnityPlayer.a(Unknown Source) E/ViewRootImpl(19244): at com.unity3d.player.UnityPlayer$c$1.handleMessage(Unknown Source) E/ViewRootImpl(19244): at android.os.Handler.dispatchMessage(Handler.java:98) E/ViewRootImpl(19244): at android.os.Looper.loop(Looper.java:173) E/ViewRootImpl(19244): at com.unity3d.player.UnityPlayer$c.run(Unknown Source)

摘要

正如我前面提到的,这只是给你一个方向在哪里看。希望你能够找到可能成为这个原因的可能位置(可能是插件代码)。我很乐意进一步协助(在评论中,或者随时感谢contact me)。

相关问题