React Native 应用程序崩溃:致命异常:java.lang.IndexOutOfBoundsException:索引 1 超出长度 0 的范围

问题描述 投票:0回答:1

堆栈跟踪:

          Fatal Exception: java.lang.IndexOutOfBoundsException: Index 1 out of bounds for length 0
       at jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
       at jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
       at jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266)
       at java.util.Objects.checkIndex(Objects.java:359)
       at java.util.ArrayList.get(ArrayList.java:434)
       at android.view.ViewGroup.getAndVerifyPreorderedView(ViewGroup.java:3993)
       at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7689)
       at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
       at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
       at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
       at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
       at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
       at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
       at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
       at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
       at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
       at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
       at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
       at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
       at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
       at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
       at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
       at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
       at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
       at com.android.internal.policy.DecorView.gatherTransparentRegion(DecorView.java:611)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:4539)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:3288)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:11344)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1689)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1698)
       at android.view.Choreographer.doCallbacks(Choreographer.java:1153)
       at android.view.Choreographer.doFrame(Choreographer.java:1079)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1646)
       at android.os.Handler.handleCallback(Handler.java:958)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loopOnce(Looper.java:230)
       at android.os.Looper.loop(Looper.java:319)
       at android.app.ActivityThread.main(ActivityThread.java:8919)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)
        

我在我的 React Native 应用程序中遇到了生产崩溃。 到目前为止还无法重现这个。

这是我的发现 如果 React Native 视图层次结构未完全呈现,或者存在竞争条件导致辅助功能服务在视图准备好之前查询视图,则可能会发生崩溃。

崩溃表明 ViewGroup 正在尝试访问不存在索引处的子视图信息。如果在未验证索引是否在范围内的情况下访问视图的子视图,则可能会发生这种情况。

当 ViewGroup 迭代其子视图时,视图层次结构可能会被修改(例如,添加/删除视图),从而导致子视图列表不一致。

调用此方法时视图列表可能被清除或未正确填充,从而导致尝试访问不存在的视图。

这些都是非常普遍的发现。我还无法重现这个

react-native crash indexoutofboundsexception android-viewgroup instabug
1个回答
0
投票

我发现了一个可能导致此崩溃的场景并设法重现它。我的场景是有一个可以上下滚动的视频和一个直播间。当您截图并触发滚动截图功能,同时向上或向下滚动直播间时,可能会导致此崩溃。也许系统在截图时,会调用“gatherTransparentRegion”方法将截图信息拼接在一起,从而触发此问题。但本质上,我认为系统保护还没有做好。当然,我不能排除中间的某些 ViewGroup(例如 RecyclerView)可能存在某些错误。可能是主线程调用时对浏览量的操作导致了这个问题。升级到 AndroidX 可能可以解决这个问题。我的解决方案是重写 RecyclerView 的“gatherTransparentRegion”方法,并添加一个 try-catch 块进行保护。

© www.soinside.com 2019 - 2024. All rights reserved.