Profile页面随机崩溃求助:IndexOutOfBoundsException异常排查
问题描述
我有一个个人资料页面,包含若干TextView、EditText和Spinner组件。页面平时运行正常,但偶尔会随机崩溃,而且崩溃属于系统内部问题,堆栈跟踪没指向我Activity文件里的具体代码行,没法确定崩溃原因。
崩溃堆栈信息
FATAL EXCEPTION: main Process: com.myapp.uat, PID: 15306 java.lang.IndexOutOfBoundsException: 1, 1 at android.text.PackedIntVector.getValue(PackedIntVector.java:75) at android.text.DynamicLayout.getLineTop(DynamicLayout.java:1011) at android.text.Layout.getLineBottom(Layout.java:2407) at android.text.Layout.getLineBottom(Layout.java:2396) at android.widget.Editor.drawHardwareAcceleratedInner(Editor.java:2262) at android.widget.Editor.drawHardwareAccelerated(Editor.java:2202) at android.widget.Editor.onDraw(Editor.java:2140) at android.widget.TextView.onDraw(TextView.java:9067) at android.view.View.draw(View.java:23889) at android.view.View.updateDisplayListIfDirty(View.java:22756) at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4540) at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4513) at android.view.View.updateDisplayListIfDirty(View.java:22712) at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4540) at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4513) at android.view.View.updateDisplayListIfDirty(View.java:22712) at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4540) at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4513) at android.view.View.updateDisplayListIfDirty(View.java:22712) at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4540) at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4513) at android.view.View.updateDisplayListIfDirty(View.java:22712) at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4540) at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4513) at android.view.View.updateDisplayListIfDirty(View.java:22712) at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4540) at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4513) at android.view.View.updateDisplayListIfDirty(View.java:22712) at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4540) at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4513) at android.view.View.updateDisplayListIfDirty(View.java:22712) at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4540) at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4513) at android.view.View.updateDisplayListIfDirty(View.java:22712) at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4540) at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4513) at android.view.View.updateDisplayListIfDirty(View.java:22712) at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4540) at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4513) at android.view.View.updateDisplayListIfDirty(View.java:22712) at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:694) at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:700) at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:798) at android.view.ViewRootImpl.draw(ViewRootImpl.java:4939) at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4643) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3822) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2465) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9305) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1339) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1348) at android.view.Choreographer.doCallbacks(Choreographer.java:952) at android.view.Choreographer.doFrame(Choreographer.java:882) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1322) at android.os.Handler.handleCallback(Handler.java:958) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:205) at android.os.Looper.loop(Looper.java:294) at android.app.ActivityThread.main(ActivityThread.java:8177) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
解决建议
- 检查文本更新逻辑:确保所有TextView/EditText的文本修改都在主线程执行,避免多线程并发修改导致布局计算出错
- 关闭硬件加速:可以在AndroidManifest.xml中给对应Activity添加
android:hardwareAccelerated="false",或者针对单个TextView/EditText调用view.setLayerType(View.LAYER_TYPE_SOFTWARE, null) - 升级SDK版本:部分旧Android系统的DynamicLayout存在此类bug,升级到较新的目标SDK可能修复系统层面的问题
- 优化文本更新频率:如果有频繁更新文本的操作,合并更新请求或添加适当延迟,减少布局重绘次数
- 捕获异常避免崩溃:继承TextView/EditText,重写
onDraw方法,捕获IndexOutOfBoundsException并处理,防止崩溃扩散
内容的提问来源于stack exchange,提问作者Sahil Manchanda
相关产品推荐
相关产品推荐

