Android性能优化之图片优化


最近不是很忙,就在看一些学习视频,做出了一些简单的总结(可能和视频有些类似,不过就当我借鉴的吧,毕竟我是用来总结的,emmmmm)。

先总结下为什么要做图片优化,以及图片优化的好处吧!

一、内存消耗变小。

二、流畅度变好。

三、减少流量的使用。

四、能使APK包变小。

五、用户体验更佳。

现在有很多第三方的图片加载框架,都可以使用,简单方便快捷,比如glide和fresco。不过我用的最多的还是glide,fresco我也只是简单的了解过,并未使用过。

先总结下图片存储优化

一、什么是OOM?

android系统的进程(APP级别)有最大内存限制,超出这个限制系统就会报出OOM的异常。

二、图片OOM产生的情况

1.一个页面一次加载过多的图片

2.加载一张超大的图片没有进行压缩处理(尺寸,质量)

3.android列表加载大量bitmap没有使用缓存

图片存储优化主要是以下三点:尺寸压缩、质量压缩、内存重用

一、尺寸压缩

bitmap里有个inJustDecodeBounds属性 设置为true

如果inJustDecodeBounds设置为true的话,解码bitmap时可以只返回其高、宽和Mime类型,而不必为其申请内存,从而节省了内存空间

inSampleSize

nSampleSize的默认值和最小值为1(当小于1时,解码器将该值当做1来处理),且在大于1时,该值只能为2的幂(当不为2的幂时,解码器会取与该值最接近的2的幂)。例如,当inSampleSize为2时,一个20001000的图片,将被缩小为1000500,相应地,它的像素数和内存占用都被缩小为了原来的1/4

改变ImageView的大小

二、质量压缩

常见的PNG、JPG、WEBP(这个我还真没用过)等格式的图片在设置到UI上之前需要经过解码过程

使用RGB_565替代ARGB_8888可以降低图片占用内存(RGB_565一个像素点占用2个字节,ARGB_8888一个像素点占用4个字节)

三、内存重用

这个我还真不知道怎么总结 一会代码里会提到

四、Bitmap的内存管理

在android3.0之前,对于像素数据的支持保存在本地内存中

从android3.0开始,像素数据和位图都保存在Dalvik堆中


public class PicTestActivity extends Activity {

    private ImageView img_test;
    
    private static final String TAG=PicTestActivity.class.getSimpleName();
    
    private Bitmap mCurrentBitmap;//内存重用,不再重新创建bitmap对象,直接使用申明好的,重复使用就可以做到内存重用

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pic_test);
        img_test=findViewById(R.id.img_test);

    }
    /**
     * 直接加载load sdcard里的图片
     */
    private void LoadOriginalSize(ImageView img){
        String sdcard= Environment.getExternalStorageDirectory().toString();
        String filePath=sdcard+"/11.jpg";
        mCurrentBitmap=BitmapFactory.decodeFile(filePath);
        img.setImageBitmap(mCurrentBitmap);
    }
    /**
     * 压缩图片
     */
    private void testPicOptimize(ImageView img){
        String sdcard= Environment.getExternalStorageDirectory().toString();
        String filePath=sdcard+"/11.jpg";

        BitmapFactory.Options options=new BitmapFactory.Options();
        options.inJustDecodeBounds=true;
        BitmapFactory.decodeFile(filePath,options);
        // img.setImageBitmap(BitmapFactory.decodeFile(filePath,options));


        int width=options.outWidth;
        options.inSampleSize=width/200;
        options.inPreferredConfig=Bitmap.Config.RGB_565;
        options.inJustDecodeBounds=false;
        Bitmap bitmap=BitmapFactory.decodeFile(filePath,options);
        img.setImageBitmap(bitmap);
    }

    /**
     * inBitmap的使用
     */
    private void testInBitmap(ImageView img){
        String sdcard= Environment.getExternalStorageDirectory().toString();
        String filePath=sdcard+"/11.jpg";

        BitmapFactory.Options options=new BitmapFactory.Options();
        options.inBitmap=mCurrentBitmap;
        Bitmap bitmap=BitmapFactory.decodeFile(filePath,options);
        img.setImageBitmap(bitmap);

    }
}

图片加载优化

一、异步请求(图片放在后台请求)

二、图片缓存(对于列表中的图片进行缓存)

三、网络请求(使用OKhttp进行网络请求)

四、懒加载(当图片呈现到可视区域再进行加载)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android性能优化是为了提高Android应用程序的运行效率和响应速度,以提升用户体验。有多个方面需要考虑和优化,如布局优化、绘制优化、网络优化、安装包优化、内存优化、卡顿优化、耗电优化、列表和图片优化、数据库优化、启动优化、数据结构优化和稳定性优化等。 在布局优化方面,可以通过减少布局层次、使用ConstraintLayout等来提高布局效率。绘制优化可以通过使用ViewStub延迟加载视图、使用ViewHolder模式优化列表视图等来加快绘制速度。网络优化可以通过合理使用缓存、减少网络请求次数等来提高网络传输效率。安装包优化可以通过混淆代码、删除无用资源等来减小APK大小。 内存优化可以通过及时释放不再使用的资源、避免内存泄漏等措施来减少内存占用。卡顿优化可以通过使用异步加载、优化耗时操作等来提高应用的流畅度。耗电优化可以通过合理管理后台任务、优化网络请求等来降低电量消耗。 列表和图片优化可以通过使用分页加载、缓存图片等方式来提高列表和图片的加载速度和效率。数据库优化可以通过使用合适的索引、批量操作等来提高数据库的查询和写入性能。启动优化可以通过延迟初始化、减少启动时的资源加载等来加快应用的启动速度。数据结构优化可以通过选择合适的数据结构来提高数据的存储和检索效率。稳定性优化则需要通过全面的测试和错误处理来保证应用的稳定性。 综上所述,Android性能优化是一个多方面的工作,需要从各个方面入手,以提高应用程序的性能和用户体验。<span class="em">1</span><span class="em">2</span><span class="em">3</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值