首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unity Daydream CalledFromWrongThreadException

Unity Daydream CalledFromWrongThreadException
EN

Stack Overflow用户
提问于 2017-05-30 19:25:19
回答 1查看 224关注 0票数 5

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

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

代码语言:javascript
复制
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,Fabric...)。

有没有人有同样的问题?

作为参考,我们使用Unity版本: 5.6.0f3,该错误仅在Pixel和Pixel XL手机上报告。

EN

回答 1

Stack Overflow用户

发布于 2017-06-04 23:32:57

我不知道你的项目的所有细节,那些无法在内部重现的错误是最糟糕的一种。尽管如此,我还是会尝试给出一些关于发生了什么的提示。也许这些提示可以提供一些启发,帮助您找出错误的根本原因:

CalledFromWrongThreadException

在Android上,View只能从创建它的线程访问。这实际上也适用于其他环境(WinFormsWPF。这个异常意味着某些东西试图从错误的线程访问某些UI元素(SurfaceView)。

com.unity3d.player.UnityPlayer$c.run

堆栈跟踪源自一些自定义Unity管道代码。虽然这没有给出这个调用来自哪里的线索(在您的C#代码中),但它可能意味着代码来自C# (使用AndroidJavaObject或AndroidJavaClass调用)。Unity的脚本线程与Android的主线程不同,所以这和你得到的异常类型是有意义的。

作为测试,我使用以下代码来模拟相同的异常:

代码语言:javascript
复制
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 :只有创建视图层次结构的原始线程才能接触它的视图。E/ViewRootImpl(19244):ViewRootImpl 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 java.lang.RuntimeException E/ViewRootImpl(19244):在android.view.View.onFocusChanged(View.java:6204) (View.java:6122) E/ViewRootImpl(19244):在android.view.View.onFocusChanged(View.java:6204) E/ViewRootImpl(19244):在android.view.View.clearFocusInternal(View.java:6089) E/ViewRootImpl(19244):在android.view.View.unFocus(View.java:6122) E/ViewRootImpl(19244):在android.view.ViewGroup.unFocus(ViewGroup.javaE/ViewRootImpl(19244):在android.view.ViewGroup.removeAllViewsInLayout(ViewGroup.java:4946) E/ViewRootImpl(19244):在android.view.ViewGroup.removeAllViews(ViewGroup.java:4905) E/ViewRootImpl(19244):在com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:410) E/ViewRootImpl(19244):在android.app.Activity.setContentView(Activity.java:2423) E/ViewRootImpl(19244):在com.unity3d.player.UnityPlayer.nativeRender(Native方法) E/ViewRootImpl(19244):在com.unity3d.player.UnityPlayer.a(未知源) E/ViewRootImpl(19244):在com.unity3d.player.UnityPlayer$c$1.handleMessage(Unknown源) E/ViewRootImpl(19244):在android.os.Handler.dispatchMessage(Handler.java:98) E/ViewRootImpl(19244):在android.os.Looper.loop(Looper.java:173) E/ViewRootImpl(19244):在com.unity3d.player.UnityPlayer$c.run(来源不详)

摘要

正如我之前提到的,这只给了你一个看的方向。希望您能够找到可能导致此问题的潜在位置(可能是插件代码)。我很乐意提供进一步的帮助(在评论中,或随时到contact me)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44260967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档