仅Android 8/8.1出现Editor.drawHardwareAccelerated崩溃问题求助
Android Oreo设备上EditText绘制时的ArrayIndexOutOfBoundsException问题
项目从Java全面迁移至Kotlin后出现异常,已花费数月排查仍未找到根源。本人在Android 8(Oreo)设备上无法复现该异常,但判断问题诱因是应用中的EditText组件。
异常信息
Firebase Crashlytics捕获的异常如下:
Fatal Exception: java.lang.ArrayIndexOutOfBoundsException length=9; index=-1 android.text.DynamicLayout.getBlockIndex (DynamicLayout.java:648) android.widget.Editor.drawHardwareAccelerated (Editor.java:1703) android.widget.Editor.onDraw (Editor.java:1672) android.widget.TextView.onDraw (TextView.java:7686) android.view.View.draw (View.java:19315) android.view.View.updateDisplayListIfDirty (View.java:18232) android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4281) android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4261) android.view.View.updateDisplayListIfDirty (View.java:18181) android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4281) android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4261) android.view.View.updateDisplayListIfDirty (View.java:18181) android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4281) android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4261) android.view.View.updateDisplayListIfDirty (View.java:18181) android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4281) android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4261) android.view.View.updateDisplayListIfDirty (View.java:18181) android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4281) android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4261) android.view.View.updateDisplayListIfDirty (View.java:18181) android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4281) android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4261) android.view.View.updateDisplayListIfDirty (View.java:18181) android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4281) android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4261) android.view.View.updateDisplayListIfDirty (View.java:18181) android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4281) android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4261) android.view.View.updateDisplayListIfDirty (View.java:18181) android.view.ThreadedRenderer.updateViewTreeDisplayList (ThreadedRenderer.java:669) android.view.ThreadedRenderer.updateRootDisplayList (ThreadedRenderer.java:675) android.view.ThreadedRenderer.draw (ThreadedRenderer.java:783) android.view.ViewRootImpl.draw (ViewRootImpl.java:3127) android.view.ViewRootImpl.performDraw (ViewRootImpl.java:2936) android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:2474) android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1456) android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:7072) android.view.Choreographer$CallbackRecord.run (Choreographer.java:916) android.view.Choreographer.doCallbacks (Choreographer.java:728) android.view.Choreographer.doFrame (Choreographer.java:660) android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:902) android.os.Handler.handleCallback (Handler.java:790) android.os.Handler.dispatchMessage (Handler.java:99) android.os.Looper.loop (Looper.java:164) android.app.ActivityThread.main (ActivityThread.java:6523) java.lang.reflect.Method.invoke (Method.java) com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:438) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:857)
对应EditText布局代码
<EditText android:id="@+id/txtcontent" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:inputType="textMultiLine|textCapSentences" android:textColor="?attr/tilecontentcolor" android:minLines="7" android:gravity="top|start" android:hint="@string/write_here" android:textColorHint="?attr/tilecontentcolor" android:fontFamily="@font/lato_regular" android:textCursorDrawable="@drawable/cursor_color" android:background="@android:color/transparent"/>
已尝试的临时方案
搜索到使用LAYER_TYPE_SOFTWARE的方案,代码如下:
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O||Build.VERSION.SDK_INT ==Build.VERSION_CODES.O_MR1) { txtcontent.setLayerType(View.LAYER_TYPE_SOFTWARE, null) }
该方案能阻止异常发生,但当EditText内容达到一定长度后无法正常显示,这对日记类应用来说不可接受。
寻求有效解决思路,如需更多细节可提供。
内容的提问来源于stack exchange,提问作者jomin v george
相关产品推荐
相关产品推荐

