java.lang.IllegalArgumentException: метод сравнения нарушает его общий контракт? - PullRequest
2 голосов
/ 26 марта 2019

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

Проверьте этот пример (это происходит только на Android 4):

enter image description here

Fatal Exception: java.lang.IllegalArgumentException: Comparison method violates its general contract!
       at java.util.ComparableTimSort.mergeHi(ComparableTimSort.java:831)
       at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:449)
       at java.util.ComparableTimSort.mergeCollapse(ComparableTimSort.java:372)
       at java.util.ComparableTimSort.sort(ComparableTimSort.java:178)
       at java.util.ComparableTimSort.sort(ComparableTimSort.java:142)
       at java.util.Arrays.sort(Arrays.java:1970)
       at java.util.Collections.sort(Collections.java:1864)
       at android.view.ViewGroup$ChildListForAccessibility.init(ViewGroup.java:6872)
       at android.view.ViewGroup$ChildListForAccessibility.obtain(ViewGroup.java:6837)
       at android.view.ViewGroup.dispatchPopulateAccessibilityEventInternal(ViewGroup.java:2706)
       at android.view.View.dispatchPopulateAccessibilityEvent(View.java:5217)
       at android.view.ViewGroup.dispatchPopulateAccessibilityEventInternal(ViewGroup.java:2712)
       at android.view.View.dispatchPopulateAccessibilityEvent(View.java:5217)
       at android.view.View.sendAccessibilityEventUncheckedInternal(View.java:5177)
       at android.view.View.sendAccessibilityEventUnchecked(View.java:5159)
       at android.view.View.sendAccessibilityEventInternal(View.java:5136)
       at android.view.View.sendAccessibilityEvent(View.java:5105)
       at android.view.View.performClick(View.java:4649)
       at android.view.View$PerformClick.run(View.java:19438)
       at android.os.Handler.handleCallback(Handler.java:733)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:146)
       at android.app.ActivityThread.main(ActivityThread.java:5602)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:515)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
       at dalvik.system.NativeStart.main(NativeStart.java)

Я обнаружил в ходе исследований, что это происходит при сравнении / сортировке, когда пропущено определенное условие. Между тем в моем коде я не использую метод сравнения или сортировки, упомянутый в документации / примерах.

Любой совет высоко ценится.

1 Ответ

1 голос
/ 03 апреля 2019

Кажется, это ошибка AOSP, на которую указывает @ bwt.

Ошибка является частью API фреймворка: http://www.docjar.com/html/api/java/util/ComparableTimSort.java.html (строка 835)

В этомВ этом случае в исходном коде Android что-то пошло не так из-за того, как вы создали свой макет, в частности, как вы организовали элементы ViewGroup.

Если это происходит только в Android 4, один из способов исправить это - обновитьваш minSdk по крайней мере до 5. Другой способ - это реализовать решение, которое некоторые люди описали в ссылке для отслеживания проблем , которое может привести к тому, что ваше приложение потеряет некоторую функцию доступности.Другой возможностью является попытка найти другой способ организации макета, который не будет аварийно завершать работу, но поскольку логика, вызывающая сбой, встроена в AOSP, это может выйти из-под вашего контроля и, возможно, рассчитывать на удачу.

Лично я бы пошел на обновление minSdk, которое, согласно Google , будет иметь очень низкое влияние на ваше приложение из-за количества пользователей в Android 4 сегодня.

...