2017-05-30 2 views
5

Wir erhalten Fehlermeldungen von Crashlytics, die einen beträchtlichen Teil unserer Benutzer betreffen (etwa 10% von ihnen). Es ist eine CalledFromWrongThreadException.Einheit Daydream CalledFromWrongThreadException

Das Problem ist, ich weiß nicht, was das Problem verursacht, und ich habe es nicht selbst. Hier ist das Protokoll:

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) 

Die com.unity3d.player.UnityPlayer$c.run(Unknown Source:20) ist wirklich nicht hier hilfsbereit als der Ursprung unbekannt ist, ich denke, es von einem Dritten Bibliothek kommen könnte (GVR SDK, Stoff ...).

Hat jemand das gleiche Problem?

Als Referenz verwenden wir Unity-Version: 5.6.0f3 und der Fehler wird nur für Pixel und Pixel XL-Telefone gemeldet.

Antwort

0

Ich habe nicht alle Details über Ihr Projekt, und die Fehler, die intern nicht reproduziert werden können, sind die schlimmsten. Trotzdem werde ich versuchen, ein paar Hinweise zu geben, was vor sich geht. Vielleicht können diese Hinweise etwas Licht und helfen Sie die Ursache des Fehlers herauszufinden:

CalledFromWrongThreadException

Auf Android kann ein Blick nur aus dem Thread zugegriffen werden, die es erstellt. Dies gilt auch für andere Umgebungen (WinForms, WPF, usw.). Diese Ausnahme bedeutet, dass etwas versucht, von einem falschen Thread auf ein Oberflächenelement (SurfaceView) zuzugreifen.

com.unity3d.player.UnityPlayer $ c.run

Der Stack-Trace stammt von einem benutzerdefinierten Unity Sanitär-Code. Während dies keinen Hinweis darauf gibt, woher dieser Aufruf stammt (in Ihrem C# -Code), könnte dies bedeuten, dass der Code aus C# stammt (mit AndroidJavaObject- oder AndroidJavaClass-Aufrufen). Der Scripting-Thread von Unity entspricht nicht dem Hauptthread von Android. Daher ist dies zusammen mit dem Ausnahmetyp, den Sie erhalten, sinnvoll.

Als Test habe ich diesen Code verwendet, um die gleiche Ausnahme zu simulieren:

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

Daraus ergab sich die folgende Ausnahme, die dem sehr ähnlich ist, Sie bekommen (zumindest an seinem Wurzel).

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)

Zusammenfassung

Wie ich schon erwähnt, das gibt Ihnen nur eine Richtung, wo sie suchen. Hoffentlich werden Sie in der Lage sein, potentielle Orte zu finden, die dafür verantwortlich sein könnten (wahrscheinlich Plugin-Code). Ich würde gerne weiter helfen (in den Kommentaren, oder fühlen Sie sich frei contact me).

Verwandte Themen