我试图通过使用位图压缩来更改图像格式,但是对某些图像进行解码会生成OOM,所以我想到了:
fun compressImage(filePath: String, sampleRate: Int? = null): Bitmap {
val options = BitmapFactory.Options().apply {
inJustDecodeBounds = true
}
BitmapFactory.decodeFile(filePath, options)
val reqSampleRate = sampleRate ?: calculateInSampleSize(options, maxWidth, maxHeight)
try {
options.inSampleSize = reqSampleRate
options.inPreferredConfig = Bitmap.Config.ARGB_8888
options.inJustDecodeBounds = false
return BitmapFactory.decodeFile(filePath, options)
} catch (e: OutOfMemoryError) {
System.gc()
// increase sample rate to get smaller bitmap size
return compressImage(filePath, reqSampleRate + 2)
}
}
用try / catch包装潜在的OOM是一种好习惯吗?还是有其他解决方案?
答案 0 :(得分:0)
内存不足错误也不例外。这是一个错误(Throwable的子代)。我认为,建议不要使用try / catch块来捕获内存不足错误并从中恢复。即使使用try / catch块,Outofmemoeryeryerror 堆内存段用完时将一次又一次触发。您可以使用以下两个方法来避免出现Outofmemoeryery错误
有关更多详细信息,您可以访问此网站-https://outofmemoryerror.io/