博客
关于我
Android框架 加载图片 库 Picasso 的使用简介
阅读量:748 次
发布时间:2019-03-22

本文共 2139 字,大约阅读时间需要 7 分钟。

Android开源库中有许多图片加载框架,本文以Picasso为例,总结开发过程中的一些优化经验。我们将以实际项目中的具体场景为出发点,介绍如何通过合理配置和自定义实现,提升应用程序的性能表现。

1. 图片裁剪模式

在实际开发过程中,为了优化列表页的加载性能,我们可以采用裁剪模式来减少列表页的布局计算开销。在查看大图模式下才加载完整的图片,而列表页中使用裁剪后的图片可以提升应用程序的初始加载速度。

Picasso.with(imageView.getContext()).load(url).resize(dp2px(250), dp2px(250)).centerCrop().into(imageView);

默认情况下,Picasso会使用当前activity的ApplicationContext,而不是从文档中获取。不管选择什么ApplicationContext,Picasso都会通过Activity获取ApplicationContext。

2. 查看大图放弃内存缓存

当我们需要查看大图时,如果要避免占用内存,可以选择不使用内存缓存,而是将图片缓存到磁盘中。这样可以优化内存管理,释放内存空间,同时加速内存的回收速度。

Picasso.with(getApplication()).load(mURL).memoryPolicy(NO_CACHE, NO_STORE).into(imageView);

需要注意的是,memoryPolicy的参数设置是唯一的方式,可选项包括:

  • NO_CACHE:图片加载时不检查内存缓存。
  • NO_STORE:图片加载完成后不存储到内存。

3. 自定义RecyclableImageView

为了进一步优化内存占用,可以自定义一个RecyclableImageView,实现内存回收的策略。通过覆盖onDetachedFromWindow方法,释放drawable引用,帮助Android系统更高效地管理内存。

public class RecyclableImageView extends ImageView {    @Override    protected void onDetachedFromWindow() {        super.onDetachedFromWindow();        setImageDrawable(null);    }}

实验结果显示,在大图加载过程中,不使用内存缓存的场景下,RecyclableImageView能够显著减少内存占用,提升内存管理效率。

4. 在新进程中查看大图

列表页的内存占用已经非常稳定,但在查看大图时,由于大图的内存占用较大,可能导致内存溢出。为此,我们可以将查看大图的逻辑放置在新进程中,以避免主进程内存不足的问题。

在AndroidManifest.xml中可以这样定义:

这样,通过在新进程中启动Activity,Picasso会基于新ApplicationContext创建单例,优化内存管理和图片加载性能。

5. 列表滑动优化

Picasso提供了灵活的配置选项,可以通过设置同一个tag来管理 RecyclerView 滑动时的图片加载状态。在RecyclerView的滑动状态发生改变时,我们可以根据新的滑动状态自动切换加载策略。

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {    @Override    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {        if (newState == RecyclerView.SCROLL_STATE_IDLE) {            Picasso.with(context).resumeTag(tag);        } else {            Picasso.with(context).pauseTag(tag);        }    }});

仅需在OnScrollListener中获取RecyclerView的滑动状态即可实现上述功能,有效缓解列表页面的滑动惯性问题。

6. RGB_565 模式优化

对于不需要透明度的图片,可以优化内存使用效果,采用RGB_565模式,减少每个像素占用内存的大小。

Picasso.with(imageView.getContext()).load(url).config(Bitmap.Config.RGB_565).into(imageView);

相比于默认的ARGB_8888模式,RGB_565模式每个像素占用2字节内存,显著降低了内存占用量。

7. 参考资料

通过以上方法,我们可以显著提升应用程序的性能表现。记住,Picasso是一个强大的图片加载框架,合理使用它的功能可以为应用程序的性能和用户体验带来很大改善。

转载地址:http://ghawk.baihongyu.com/

你可能感兴趣的文章
MySQL中的IO问题分析与优化
查看>>
MySQL中的ON DUPLICATE KEY UPDATE详解与应用
查看>>
mysql中的rbs,SharePoint RBS:即使启用了RBS,内容数据库也在不断增长
查看>>
mysql中的undo log、redo log 、binlog大致概要
查看>>
Mysql中的using
查看>>
MySQL中的关键字深入比较:UNION vs UNION ALL
查看>>
mysql中的四大运算符种类汇总20多项,用了三天三夜来整理的,还不赶快收藏
查看>>
mysql中的字段如何选择合适的数据类型呢?
查看>>
MySQL中的字符集陷阱:为何避免使用UTF-8
查看>>
mysql中的数据导入与导出
查看>>
MySQL中的时间函数
查看>>
mysql中的约束
查看>>
MySQL中的表是什么?
查看>>
mysql中穿件函数时候delimiter的用法
查看>>
Mysql中索引的分类、增删改查与存储引擎对应关系
查看>>
Mysql中索引的最左前缀原则图文剖析(全)
查看>>
MySql中给视图添加注释怎么添加_默认不支持_可以这样取巧---MySql工作笔记002
查看>>
Mysql中获取所有表名以及表名带时间字符串使用BetweenAnd筛选区间范围
查看>>
Mysql中视图的使用以及常见运算符的使用示例和优先级
查看>>
Mysql中触发器的使用示例
查看>>