用try / catch包装潜在的OutOfMemory错误可以吗?

时间:2019-07-09 06:36:21

标签: android out-of-memory

我试图通过使用位图压缩来更改图像格式,但是对某些图像进行解码会生成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是一种好习惯吗?还是有其他解决方案?

1 个答案:

答案 0 :(得分:0)

内存不足错误也不例外。这是一个错误(Throwable的子代)。我认为,建议不要使用try / catch块来捕获内存不足错误并从中恢复。即使使用try / catch块,Outofmemoeryeryerror  堆内存段用完时将一次又一次触发。您可以使用以下两个方法来避免出现Outofmemoeryery错误

  1. 遵循代码实现的最佳实践
  2. 使用VM标志使用正确的内存设置

有关更多详细信息,您可以访问此网站-https://outofmemoryerror.io/