最近在开发项目的过程中,测试反馈了一个bug,崩溃日志如下:
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:6641)
at android.view.ViewGroup$ChildListForAccessibility.obtain(ViewGroup.java:6606)
at android.view.ViewGroup.addChildrenForAccessibility(ViewGroup.java:1689)
at android.view.ViewGroup.onInitializeAccessibilityNodeInfoInternal(ViewGroup.java:2517)
at android.view.View.onInitializeAccessibilityNodeInfo(View.java:5193)
at android.view.View.createAccessibilityNodeInfoInternal(View.java:5154)
at android.view.View.createAccessibilityNodeInfo(View.java:5141)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:811)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:834)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:834)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:834)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:834)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:834)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:834)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:834)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:834)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:834)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchAccessibilityNodeInfos(AccessibilityInteractionController.java:720)
at android.view.AccessibilityInteractionController.findAccessibilityNodeInfoByAccessibilityIdUiThread(AccessibilityInteractionController.java:147)
at android.view.AccessibilityInteractionController.access$300(AccessibilityInteractionController.java:49)
at android.view.AccessibilityInteractionController$PrivateHandler.handleMessage(AccessibilityInteractionController.java:971)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5314)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:680)
at dalvik.system.NativeStart.main(Native Method)
一开始看到这个崩溃日志一脸懵逼,这分明是系统ViewGroup内部调用了排序算法报的错,这不知道怎么入手。百度了一大圈,发现都是说JDK1.7的排序算法改了,但是app没有用到排序算法,所以我遇到的根本问题不是排序导致的问题。百度找不到,还有谷歌,果然还是能找到比较相关的问题。其中看到一篇文章https://www.b4x.com/android/forum/threads/debugging-a-problematic-comparison.41313/#content 里面的一个回答给了我提示
意思就是说如果你的布局ViewGroup里面有两个或者两个以上的子控件的topleft xy是一样的情况下就会导致这个异常。这就有思路了,马上检查布局,果然发现是一个约束布局,
app:layout_constraintStart_toStartOf="@+id/red_envelope_home_photo_iv" app:layout_constraintTop_toTopOf="@+id/red_envelope_home_photo_iv"
用到了这两个属性,这就导致xy是一样的,马上把另外一个去掉,就不崩溃了。用了一天解决的问题,记录下