1.Bitmap概述

1.1 Bitmap基本信息


总的来说就是几个类,BitmapFactory,config,& option

1.2 config

public enum Config {
        ALPHA_8     (1),只有透明度组成,一般没用

        RGB_565     (3),  r-5/g-b-b-5 共16位

        @Deprecated
        ARGB_4444   (4),rgba,每部分4字节

        ARGB_8888   (5),rgba,每部分8字节,共32位

        RGBA_F16    (6), HDR格式,新格式。

        HARDWARE    (7);
    }

1.3 matrix操作

剪切,缩放,移动,旋转等操作由matrix负责。

private fun readBitmap() {
        var inputStream = assets.open("aaa.png")
        bitmap = BitmapFactory.decodeStream(inputStream)
        imageView.setImageBitmap(bitmap)
        var matrix = Matrix()
        matrix.postScale(0.8f, 0.9f)
        matrix.postRotate(45f)
        bitmap?.let {
            bitmapNew = Bitmap.createBitmap(it,0,0,it.width,it.height,matrix,true)
            imageView2.setImageBitmap(bitmapNew)
        }
    }
    override fun onDestroy() {
        super.onDestroy()
        bitmap?.recycle()
        bitmapNew?.recycle()
        bitmapNew = null
        bitmap = null
    }

2.Bitmap导致的OOM问题

2.1 为啥要recycle

应为bitmap的内存不单单只有java的部分,还有native的部分。

    public void recycle() {
        if (!mRecycled) {
            nativeRecycle(mNativePtr);
            mNinePatchChunk = null;
            mRecycled = true;
        }
    }

nativeRecycle就是释放native的部分。
还有就是既然释放了内存,bitmap就不能在使用了。
OOM具体是啥就不解释了,导致了OOM,基本app就会crash了。
还是这里不释放bitmap的话,存在内存泄漏的可能。

3.Bitmap OOM问题的处理

3.1 压缩图片

上面已经说了,可以压缩图片,如果显示的图片过大的话,建议控制在1000*1000以内。

3.2 config调整

可以把图片调整为565格式的,这样也可以降低内存,当然同时会损失图片精度。

3.3 LruCache

通过LruCache,存储图片,防止图片过多导致OOM。

发表评论

电子邮件地址不会被公开。 必填项已用*标注