基本上,我从用户存储中读取图像进行处理,在读取图像的同时,我计算inSampleSize以节省一些内存,以下是我的代码:

fun calculateInSampleSize(
    options: BitmapFactory.Options,
    reqWidth: Int,
    reqHeight: Int
): Int {
    // Raw height and width of image
    val (height: Int, width: Int) = options.run { outHeight to outWidth }
    var inSampleSize = 1
    if (height > reqHeight || width > reqWidth) {
        val halfHeight: Int = height / 2
        val halfWidth: Int = width / 2
        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while (halfHeight / inSampleSize >= reqHeight && halfWidth / inSampleSize >= reqWidth) {
            inSampleSize *= 2
        }
    }
    return inSampleSize
}

但是,我得到的是ArithmeticException:While循环条件中被零除:

halfHeight / inSampleSize >= reqHeight && halfWidth / inSampleSize >= reqWidth

我认为inSampleSize永远不会是零,因为它从1开始,并在每次迭代中乘以2.有人能帮帮我吗?这是怎么回事?

它只对一些用户崩溃(到目前为止有大约13次崩溃),我不能重现它.

编辑,添加了故障日志(log):

Non-fatal Exception: java.lang.ArithmeticException: divide by zero
       at myapp.myapp.myapp.utils.UtilsKt.calculateInSampleSize(Utils.kt:108)
       at myapp.myapp.myapp.utils.UtilsKt$resizeImageWithPixel$2.invokeSuspend(Utils.kt:464)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
       at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
       at kotlinx.coroutines.internal.LimitedDispatcher.run(LimitedDispatcher.kt:42)
       at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:95)
       at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.java:570)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
       at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)

enter image description here

推荐答案

我认为inSampleSize永远不会是零,因为它从1开始,并在每次迭代中乘以2.有人能帮帮我吗?这是怎么回事?

我认为这就是你错的地方.如果你让你的整数溢出,你肯定可以通过乘以2得到零:

var inSampleSize = 1
while (inSampleSize != 0) {
    println("inSampleSize = $inSampleSize")
    inSampleSize *= 2
}
println("inSampleSize is 0 now!")

你可以在这里亲自看看:https://pl.kotl.in/uZHs7YQCW

inSampleSize = 1
inSampleSize = 2
inSampleSize = 4
inSampleSize = 8
inSampleSize = 16
inSampleSize = 32
inSampleSize = 64
inSampleSize = 128
inSampleSize = 256
inSampleSize = 512
inSampleSize = 1024
inSampleSize = 2048
inSampleSize = 4096
inSampleSize = 8192
inSampleSize = 16384
inSampleSize = 32768
inSampleSize = 65536
inSampleSize = 131072
inSampleSize = 262144
inSampleSize = 524288
inSampleSize = 1048576
inSampleSize = 2097152
inSampleSize = 4194304
inSampleSize = 8388608
inSampleSize = 16777216
inSampleSize = 33554432
inSampleSize = 67108864
inSampleSize = 134217728
inSampleSize = 268435456
inSampleSize = 536870912
inSampleSize = 1073741824
inSampleSize = -2147483648
inSampleSize is 0 now!

Android相关问答推荐

如何允许我的应用程序在Android 10上运行,同时目标是API 33

Android添加设置图标齿轮到应用程序信息

ENV变量在gradle进程中没有更新

如何在"不同活动"中添加不同按钮?

Android 14无法删除已配置的文件

关闭导致Kotlin中的内存泄漏?

Android-交叉引用表中的ForeignKey用于什么?

使用 async 向网络发出并行请求并在supervisorScope中处理它们

FFmpeg Android 错误

有没有办法迭代类型安全的项目访问器?

如何在 kotlin 中接收带有和不带有可空对象的集合并保持引用相同

Jetpack Compose的val变量不能被重新分配

DatePickerDialog (Android/Kotlin) 的两个问题

系统导航栏在某些场景下应用了深色效果

在 jetpack compose 中交替使用 View.INVISIBLE

在 react native 中设置 react-native-paper 组件的样式

验证硬编码密码

try 使用 ViewPager2 实现滑动视图时出现类型不匹配错误

Jetpack Compose Alignment - 误解了 alignBy 修饰符

为什么在try 实例化 Mediaplayer 时会出现 NullPointerException?安卓Kotlin