java.lang.IllegalArgumentException:比较方法是否违反其常规协定?

时间:2019-03-26 16:03:54

标签: android firebase crashlytics

我发现了许多与此标题相关的重复问题,但都与我的问题无关,因为无法通过crashlytics跟踪我的问题。 我不断收到关于此标题的很多崩溃信息。

检查此示例(仅在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 个答案:

答案 0 :(得分:1)

@bwt指出,这似乎是AOSP的错误。

该错误是框架API的一部分: http://www.docjar.com/html/api/java/util/ComparableTimSort.java.html(第835行)

在这种情况下,由于构建布局的方式(特别是组织ViewGroup元素的方式),Android的源代码中发生了问题。

如果仅在Android 4上发生此问题,一种解决方法是将minSdk至少升级到5。另一种方法是实施issue tracker link中某些人描述的解决方案,这可能会导致您应用程序以释放一些辅助功能。另一种可能是尝试找到一种不会使布局崩溃的其他方式来组织布局,但是由于导致崩溃的逻辑已嵌入到AOSP中,因此这将超出您的控制范围,甚至可能会靠运气。

我个人会去进行minSdk升级,根据Google的说法,由于当今Android 4的用户数量众多,这对您的应用影响很小。