• 作者:老汪软件技巧
  • 发表时间:2024-10-31 11:00
  • 浏览量:

在开发过程中,我们多多少少都遇到过应用崩溃的情况,这里总结一些常见的崩溃问题,可以帮助减少一些开发中出现的问题

屏幕截图 2024-09-18 222428.png

DialogFragment 使用 dismiss 关闭弹窗

在开发中,我们常常使用 DialogFragment 显示弹窗。如果你使用了 DialogFragment ,那么你就需要注意使用 DialogFragment 的 dismissAllowingStateLoss 而不是 dismiss 方法。

这是因为,当使用dismiss方法来关闭DialogFragment时,在某些情况下可能会导致Activity状态丢失异常 java.lang.IllegalStateException,因此如果没有保存状态的需要,更推荐使用 dismissAllowingStateLoss来关闭弹窗。

Fragment 使用 commit 来显示

在 Android 中,提供了 commit、 commitNow 、commitAllowingStateLoss 和 commitNowAllowingStateLoss 四种方法来执行事务操作。它们的作用如下:

方法作用

commit

将一个Fragment事务添加到FragmentManager的事务队列中,但不会立即执行,会等待线程准备好后才执行事务。该方法不能在Activity的onSaveInstanceState方法之后调用,否则会抛出异常

commitNow

不同于 commit 方法,该方法会立即执行事务。但是该方法不能在Activity的onSaveInstanceState方法之后调用,否则会抛出异常

commitAllowingStateLoss

和commit 方法作用一致,不同的是该方法允许状态丢失,可以在onSaveInstanceState方法之后调用,并且不会抛出异常

commitNowAllowingStateLoss

和 commitNow 方法作用一样,不同的是该方法允许状态丢失,可以在onSaveInstanceState方法之后调用,并且不会抛出异常

从上面的表格可以看出,除非需要保存状态,否则不推荐使用 commit 和 commitNow 方法。

Bitmap 创建

安卓崩溃类型__android崩溃率合理范围

在开发过程中,我们常常使用 Bitmap。这里需要注意使用 Bitmap 的 create 方法或者 BitmapFactory的 decodeXXX 方法来创建一个 Bitmap 对象时可能会抛出异常。因此建议使用 runCatching 来确保异常的处理。

runCatching {
    Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
}

除了 Bitmap 创建需要注意之外,我们使用 Bitmap 前还需要判断是否被回收。

first 和 last 和 get

在 kotlin 的集合扩展函数中,我们可以很简单的通过 first 、last 、get 方法来分别获取第一个、最后一个和指定位置的值。但是一旦获取不到指定的值,这些方法就会抛 NoSuchElementException 异常,导致应用崩溃

为了避免这些可能的崩溃情况,建议使用 firstOrNull 、lastOrNull、getOrNull、 getOrElse 方法来代替上面方法。

文件长度太长

在 Android 中,文件名长度一般有一定限制,通常最大长度在 255 个字符左右。如果文件名的长度超过了最大的长度会抛出异常,造成程序崩溃。

除以0

在开发过程中,我们不可避免的会使用到除法,这时就需要注意除数是不能为0的。我们可以在使用除法前,提前判断,也可以使用 coerceAtLeast 方法来确保最小值大于0。

val result = a / b.coerceAtLeast(1)

使用Glide前,先判断页面是否回收

由于 Glide 加载图片是异步操作,当界面被destory后,这个网络请求刚好成功了,这时调用Glide.with就会发生 You cannot start a load for a destroyed activity错误。解决方法是在调用Glide.with前先判断,代码如下:

service?.fetchUserProfile(id) { result, errMsg, icon ->
    if (result == 200) {
       if (context is FragmentActivity) {
            if ((context as FragmentActivity).isFinishing || (context as FragmentActivity).isDestroyed) {
                return
            }
        }
        Glide.with(context)
            .load(icon)
            .into(view)
    }
}

Csense - Kotlin Checked Exceptions

最后推荐一个发现可能抛出异常的插件 Csense - Kotlin Checked Exceptions,当你使用一个可能抛出异常的方法时,这个插件会显示图标提示,非常方便。

image.png


上一条查看详情 +鸿蒙NEXT+Flutter开发7-存储应用设置项
下一条 查看详情 +没有了