Сбой из-за иерархии только на нуге - PullRequest
0 голосов
/ 13 февраля 2019

Я столкнулся с крахом моего приложения для Android с трассировкой стека ниже.

Меня удивляет то, что один и тот же код с одинаковыми значениями переменных (пробовал с помощью отладчика) не дает сбой на Android 8 и 9, только на 7.0 / 7.1 .Причина в том, что self-explanatory: есть некоторая перерисовка, запущенная из класса (VoipCallsManager), которая не выполняется в потоке пользовательского интерфейса, но почему это не запускается на более новом 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.

1 Ответ

0 голосов
/ 13 февраля 2019

Трассировка стека указывает, что UseCase является потоком и запущен ThreadPoolExecutor, поэтому правильное поведение - генерировать исключение.Вы можете обернуть этот код с помощью runOnUiThread (), чтобы избежать этой проблемы.

Однако, почему он не падает в других версиях?Если вы действительно хотите копать до дна, вы можете сделать намеренное падение в этом месте, например, разделить на ноль.Таким образом, вы можете иметь трассировку стека на других устройствах.Вы можете сравнить с тем, что вы перечислили здесь, возможно, вы обнаружите, что он не запущен в потоке.

...