Android APP内存优化

一、View设置

在Android的 View 里有透明度的属性,当设置透明度setAlpha的时候,android里默认会把当前view绘制到offscreen buffer中,然后再显示出来。 这个offscreen buffer 可以理解为一个临时缓冲区,把当前View放进来并做透明度的转化,然后在显示到屏幕上。这个过程是消耗资源的,所以应该尽量避免这个过程。避免这个过程可以分很多种情况,常见的有:

1、无背景的TextView,直接设置文字颜色,而不是设置整体alpha;

2、ImageView设置图片透明度setImageAlpha

3、自定义View设置绘制时的paint的透明度。


系统也提供了接口,当继承了hasOverlappingRendering()方法并返回false后,android会自动进行合理的优化,避免使用offscreen buffer。需要注意的是,当调用forceHasOverlappingRendering(boolean b)后这个方法就会被忽略。

 

二、布局优化

xml 中合理使用 ViewStub、include、merge 标签。

ViewStub 可以有效降低 xml 布局绘制UI性能消耗,在需要的时候再去绘制

include、merge 配合使用,增加 layout 复用和减少 layout 层级。


三、使用图片压缩

Android中的图片是以Bitmap方式绘制,直接影响到app运行时的内存,需要合理地使用Bitmap。在 Android 中 Bitmap 所占用的内存计算公式是:图片长度 x 图片宽度 x 像素点的字节数

不同格式的 Bitmap 像素点大小不同,常见格式如下:


ALPHA_8       每个像素都存储为一个半透明(alpha)通道。表示8位Alpha位图,即透明度占8个位,一个像素点占用1个字节,它没有颜色,只有透明度。
ARGB_4444  每个像素存储在2个字节,由于此配置的质量较差,API 13中弃用,建议使用ARGB_8888。
ARGB_8888  每个像素存储在4个字节。表示32位ARGB位图。
RGB_565      每个像素存储在2个字节中,只有RGB通道被编码:红色以5位精度存储(32个值),绿色以6位精度存储(64个值),蓝色以5位精度存储(32个值)。

我们在做压缩处理的时候,可以先通过改变Bitmap的图片格式,来达到压缩的效果,其实压缩最主要就是要么改变其宽高,要么就通过减少其单个像素占用的内存。常用的压缩方法:
1.质量压缩

    private void compressQuality() {
        Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);
        mSrcSize = bm.getByteCount() + "byte";
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        bm.compress(Bitmap.CompressFormat.JPEG, 80, bos); //1~100可选
        byte[] bytes = bos.toByteArray();
        mSrcBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    }

质量压缩不会减少图片的像素,它是在保持像素的前提下改变图片的位深及透明度,来达到压缩图片的目的,图片的长,宽,像素都不会改变,那么bitmap所占内存大小是不会变的。
我们可以看到有个参数:quality,可以调节你压缩的比例,但是还要注意一点就是,质量压缩堆png格式这种图片没有作用,因为png是无损压缩。


2.采样率压缩

    private void compressSampling() {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 2;
        mSrcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test, options);
    }

采样率压缩其原理其实也是缩放bitamp的尺寸,通过调节其inSampleSize参数,比如调节为2,宽高会为原来的1/2,内存变回原来的1/4.


3.放缩法压缩

    private void compressMatrix() {
        Matrix matrix = new Matrix();
        matrix.setScale(0.5f, 0.5f);
        Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);
        mSrcBitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
        bm = null;
    }

    private void compressScaleBitmap() {
        Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);
        mSrcBitmap = Bitmap.createScaledBitmap(bm, 600, 900, true);
        bm = null;
    }

放缩法压缩使用的是通过矩阵对图片进行裁剪,也是通过缩放图片尺寸,来达到压缩图片的效果,和采样率的原理一样。


4.格式像素转换压缩

    private void compressRGB565() {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        mSrcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test, options);
    }

这是通过压缩像素占用的内存来达到压缩的效果,一般不建议使用ARGB_4444,因为画质太差,如果对透明度没有要求,建议可以改成RGB_565,相比ARGB_8888将节省一半的内存开销。

 

你可能感兴趣的:(Android)