我正面临下面堆栈跟踪的Android应用程序崩溃。
让我感到困惑的是,具有相同变量值的相同代码(已通过调试器尝试)在 Android 8和9上不会崩溃,仅在7.0 / 7.1 上会崩溃。原因是self-explanatory:
从类(VoipCallsManager)触发了一些重绘,这些重绘没有通过UI线程完成,但是为什么在较新的Android上没有触发重绘?
E/FatalExceptionKalliope: Uncaught Exception
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6898)
at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1083)
at android.view.ViewGroup.invalidateChild(ViewGroup.java:5205)
at android.view.View.invalidateInternal(View.java:13660)
at android.view.View.invalidate(View.java:13624)
at android.view.View.invalidate(View.java:13608)
at android.widget.ImageView.setImageDrawable(ImageView.java:531)
at android.support.v7.widget.AppCompatImageView.setImageDrawable(AppCompatImageView.java:100)
at it.myapp.MainActivity.onSoftPhoneChangeSettings(MainActivity.java:2582)
at it.myapp.stefanotest.VoipCallsManager.isActive(VoipCallsManager.java:187)
at it.myapp.call.MakeCall.executeUseCase(MakeCall.java:53)
at it.myapp.call.MakeCall.executeUseCase(MakeCall.java:15)
at it.myapp.UseCase.run(UseCase.java:40)
at it.myapp.UseCaseHandler$$Lambda$0.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
2019-02-12 19:09:52.340 6961-7055/it.myapp I/intouchste: Uncaught Exception Only the original thread that created a view hierarchy can touch its views.
答案 0 :(得分:0)
堆栈跟踪表明UseCase是一个线程,由ThreadPoolExecutor启动,因此抛出异常是正确的行为。您可以使用runOnUiThread()包装该代码,以避免出现此问题。
但是为什么它在其他版本上不崩溃?如果您确实想深入挖掘底部,则可以在该位置故意崩溃,例如除以零。因此,您可以在其他设备上进行堆栈跟踪。您可以将其与此处列出的内容进行比较,可能会发现它不是在线程中启动的。