Android图片加载库—Picasso一个强大的图像下载和缓存库
介绍
GitHub源码 点击查看
Picasso是一款强大的图片下载和缓存开源软件,只能在Android平台上使用,由Square开发。使用Picasso可以添加一些必须的特性和视觉效果到Android应用中的图片。
Picasso还可以自动处理一些加载图片时遇到的常见失误:
1.在adapter中需要取消已经不在视野范围的ImageView图片资源的加载,否则会导致图片错位,Picasso已经解决了这个问题。
2.使用复杂的图片压缩转换来尽可能的减少内存消耗
3.自带内存和硬盘二级缓存功能
使用Picasso有如下好处:
1、减少内存消耗。
2、提供一个接口调整和裁剪图片的大小和形状。
我们对图片加载的要求
1.加载速度要快
2.资源消耗要低
3.加载图片不能错位
Picasso是否满足要求?
加载速度要快
1.标配策略,MemoryCache+DiskCache+Net。提高加载速度,同时保证流量。
- MemoryCache采用的是Lru策略,持有一定数量处理过的图(譬如经过resize/rotate处理,可直接设置到view中)。
- DiskCache是网络图片在本地的缓存,缓存的是原图,可能需要经过处理才能设置到view中。
- Net是图片服务器,当MemoryCache和DiskCache均取不到图片时,网络拉取,成本最高。
- Net部分,兼顾单请求加载速度与多请求并发能力,从而提高整体加载速度。
- MemoryCache部分,通过Lru策略提高缓存效率。
资源消耗要低
1.渲染适当尺寸图片来减少内存。
2.通过线程池来限制并发的图片加载线程,降低资源消耗。
3.请求相同图片的线程要合并,减少线程数。
加载图片不能错位
AdapterView会 复用 View,Picasso通过Map<ImageView,Action>机制保证View展示正确的图。
若获取的图片Action与ImageView不符合,则丢弃,等待正确的Action执行完。
可见,Picasso已经满足了我们对图片加载的需求。
方法栗子
依赖:
compile 'com.squareup.picasso:picasso:2.5.2'
基本使用
picasso仅需一行代码就能实现图片的异步加载
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
Picasso特性
Adapter 中的下载:Adapter的重用会被自动检测到,Picasso会取消上次的加载
@Override
public void getView(int position, View convertView, ViewGroup parent) {SquaredImageView view = (SquaredImageView) convertView;if (view == null) {view = new SquaredImageView(context);}String url = getItem(position);Picasso.with(context).load(url).into(view);
}
图片转换:转换图片以适应布局大小并减少内存占用
Picasso.with(context).load(url).resize(50, 50).centerCrop().into(imageView)
你还可以自定义转换:
public class CropSquareTransformation implements Transformation {@Override public Bitmap transform(Bitmap source) {int size = Math.min(source.getWidth(), source.getHeight());int x = (source.getWidth() - size) / 2;int y = (source.getHeight() - size) / 2;Bitmap result = Bitmap.createBitmap(source, x, y, size, size);if (result != source) {source.recycle();}return result;}@Override public String key() { return "square()"; }
}
将CropSquareTransformation 的对象传递给transform 方法即可。
Place holders-空白或者错误占位图片
picasso提供了两种占位图片,未加载完成或者加载发生错误的时需要一张图片作为提示。
Picasso.with(context).load(url).placeholder(R.drawable.user_placeholder)//没有加载图片时显示的默认图像.error(R.drawable.user_placeholder_error)// 图像加载错误时显示的图像.into(imageView);// 被加载的控件
如果加载发生错误会重复三次请求,三次都失败才会显示erro Place holder。
资源文件的加载
除了加载网络图片以外,picasso还支持加载Resources, assets, files, content providers中的资源文件。
Picasso.with(context).load(R.drawable.landing_screen).into(imageView1);
Picasso.with(context).load("file:///android_asset/DvpvklR.png").into(imageView2);
Picasso.with(context).load(new File(...)).into(imageView3);
三级缓存原理
1.节省流量的设计
1.1设置集合为一级
1.2设置File为二级
1.3.设置网络为三级
2.读取顺序
2.1.先从内存读取 有就返回 ,没有
2.2.从文件读取 有就返回 同时缓存到内存 ,没有
2.3.从网络读取 有就返回 同时缓存到内存与文件,没有
2.4.显示默认图
Demo栗子第1颗
1.搭建Picasso环境
gradle
compile 'com.squareup.picasso:picasso:2.5.2'
2.权限
<!--网络--><uses-permission android:name="android.permission.INTERNET"/><!--sd卡--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
java
//(Picasso:毕加索,一个三级缓存原理实现的图片加载库)//步骤二。使用Picasso加载网络图片//2.1.布局一个ImageView并查找控件imageView = (ImageView) findViewById(R.id.image);//2.2.准备一个网络连接url = "http://dynamic-image.yesky.com/740x-/uploadImages/2014/188/15/4EABKK639PIS.jpg";//2.3.使用picasso加载}public void showImage(View view) {Picasso.with(this)//设置上下文.load(url)//设置连接地址.resize(50,50)//指定图片大小.centerCrop()//设置android:scaleType变量centerCrop.into(imageView);//指定显示控件}
Demo栗子2
列表使用Picasso加载图片案例
public class ListViewActivity extends AppCompatActivity {private ListView lv_main;private List<SunBean> listDatas;private SunAdapter lAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.list_view);lv_main = (ListView) findViewById(R.id.list_sun);listDatas = new ArrayList<>();initData();lAdapter = new SunAdapter(listDatas, this);lv_main.setAdapter(lAdapter);}/** * 初始化数据 */private void initData() {SunBean sun1 = new SunBean();sun1.setTitle("太阳的后裔一"); sun1.setPicUrl("http://img3.imgtn.bdimg.com/it/u=3746050745,4184822198&fm=11&gp=0.jpg");listDatas.add(sun1);SunBean sun2 = new SunBean();sun2.setTitle("太阳的后裔二");sun2.setPicUrl("http://cdn.duitang.com/uploads/item/201603/02/20160302223503_jmdXT.thumb.224_0.jpeg");listDatas.add(sun2);SunBean news3 = new SunBean();news3.setTitle("太阳的后裔三" news3.setPicUrl("http://img5.duitang.com/uploads/item/201602/23/20160223132131_RNSQ3.thumb.224_0.jpeg");listDatas.add(news3);SunBean sun4 = new SunBean();sun4.setTitle("太阳的后裔四");sun4.setPicUrl("http://img5.duitang.com/uploads/item/201603/03/20160303163634_iveUE.thumb.224_0.jpeg");listDatas.add(sun4);SunBean sun5 = new SunBean();sun5.setTitle("太阳的后裔五"); sun5.setPicUrl("http://cdn.duitang.com/uploads/item/201603/07/20160307013640_FQCTc.thumb.224_0.jpeg");listDatas.add(sun5);SunBean sun6 = new SunBean();sun6.setTitle("太阳的后裔六");sun6.setPicUrl("http://img4.duitang.com/uploads/item/201603/03/20160303102359_vzwPC.thumb.224_0.jpeg");listDatas.add(sun6);SunBean news7 = new SunBean();news7.setTitle("太阳的后裔七");
news7.setPicUrl("http://img4.duitang.com/uploads/item/201603/03/20160303101132_AMPRv.thumb.224_0.jpeg");listDatas.add(news7);SunBean sun8 = new SunBean();sun8.setTitle("太阳的后裔八");
sun8.setPicUrl("http://img0.imgtn.bdimg.com/it/u=1043934750,464206674&fm=11&gp=0.jpg");listDatas.add(sun8);}
}
public class SunAdapter extends BaseAdapter {private List<SunBean> list_sun;private LayoutInflater inflater;private Context context;public SunAdapter(List<SunBean> list_new, Context context) {this.list_sun = list_new;this.context = context;this.inflater = LayoutInflater.from(context);}@Overridepublic int getCount() {return list_sun.size();}@Overridepublic Object getItem(int position) {return list_sun.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ItemViewHodler viewHolder;if (convertView == null) {viewHolder = new ItemViewHodler();convertView = inflater.inflate(R.layout.list_item, null);viewHolder.title = (TextView) convertView.findViewById(R.id.item_title);viewHolder.pic = (ImageView) convertView.findViewById(R.id.item_pic);convertView.setTag(viewHolder);} else {viewHolder = (ItemViewHodler) convertView.getTag();}viewHolder.title.setText(list_sun.get(position).getTitle());Picasso.with(context).load(list_sun.get(position).getPicUrl()).fit().placeholder(R.mipmap.alibg).error(R.mipmap.ic_launcher).into(viewHolder.pic);return convertView;}class ItemViewHodler {TextView title;ImageView pic;}
}
public class SunBean {private String title;private String picUrl;public SunBean(String title, String picUrl) {this.title = title;this.picUrl = picUrl;}public SunBean() {}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getPicUrl() {return picUrl;}public void setPicUrl(String picUrl) {this.picUrl = picUrl;}
}
list_itmxml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"><TextView android:id="@+id/item_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:text="太阳的后裔" /><ImageView android:id="@+id/item_pic" android:layout_width="160dp" android:layout_height="240dp" android:layout_centerHorizontal="true" android:layout_below="@id/item_title" android:src="@mipmap/alibg" /></RelativeLayout>
list_view.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"><ListView android:id="@+id/list_sun" android:layout_width="match_parent" android:layout_height="match_parent"></ListView></RelativeLayout>
最后不要忘了增加网络权限
<uses-permission android:name="android.permission.INTERNET" />
Android图片加载库—Picasso一个强大的图像下载和缓存库相关推荐
- android glide的历史,Android 图片加载的那些事:为什么你的Glide 缓存没有起作用?...
前言Glide,该功能非常强大 Android 图片加载开源框架 相信大家并不陌生 正由于他的功能强大,所以它的源码非常复杂,这导致很多人望而却步 本人尝试将 Glide 的功能进行分解,并单独针对 ...
- fackbook的Fresco (FaceBook推出的Android图片加载库-Fresco)
[Android开发经验]FaceBook推出的Android图片加载库-Fresco 欢迎关注ndroid-tech-frontier开源项目,定期翻译国外Android优质的技术.开源库.软件架构 ...
- 从UIL库谈Android图片加载中需要注意的事情
Android Universal Image Loader 算是Android中最流行的图片加载库了,作者Sergey的确牛逼,能将整个Android图片加载的点点滴滴考虑的如此全面.网上研究这个开 ...
- 图片加载框架Picasso - 源码分析
简书:图片加载框架Picasso - 源码分析 前一篇文章讲了Picasso的详细用法,Picasso 是一个强大的图片加载缓存框架,一个非常优秀的开源库,学习一个优秀的开源库,,我们不仅仅是学习它的 ...
- Android图片加载框架最全解析(八),带你全面了解Glide 4的用法
本文转载自郭神的Glide分析系列:http://blog.csdn.net/guolin_blog/article/details/78582548 本文同步发表于我的微信公众号,扫一扫文章底部的二 ...
- Android图片加载框架 Glide 4 的用法
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/78582548 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...
- Android图片加载框架——Glide(Glide v4)
原文地址 Android图片加载框架--Glide(Glide v4) 前言 android中图片加载框架有很多,所有框架最终达到的目都是在Android平台上以极度简单的方式加载和展示图片,如果我们 ...
- Android 图片加载框架Coil使用总结
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/122040645 本文出自[赵彦军的博客] 文章目录 简介 简单使用 高斯模糊 圆角 ...
- Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/78357251 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...
最新文章
- apache-2.4.x 编译安装方法
- SDN商用落地:遍地开花不代表全面实现
- opengl加载显示3D模型Q3O类型文件
- JavaScript实现快速傅立叶变换FFT算法(附完整源码)
- 根据DLL创建LIB输出库的方法
- 对软件测试的认识你了解多少
- 类视图ListView和DetailView比较
- delphi 脚本引擎比较
- mysql预编译表名_JDBC预编译语句表名占位异常
- 【免费办公软件】万彩办公大师教程丨二维码生成器
- 网友对各种杀软的评价诗歌
- axure不能导出图片_Axure7.0导出图片提示内存不足,如何解决?
- React中过渡动画的编写方式
- excel 单元格插入图片
- 用php和mysql开发招聘网站
- openssl命令查看证书有效期_kubeadm初始化k8s集群延长证书过期时间
- 中国石油大学-《大学英语二》第二阶段在线作业
- JavaScript创始人Brendan Eich访谈录(转)
- python 福利_python 处理json
- IMS:MotionEvent 坐标点(上)
热门文章
- Anaconda D2L 虚拟环境安装配置
- TOPSIS算法与熵权法
- linux 当前日期上月最后一天_在linux昨天(前一天)的日期
- 2022-2027年中国三网融合行业市场全景评估及发展战略规划报告
- handoff 流程
- 2021年危险化学品经营单位主要负责人考试及危险化学品经营单位主要负责人新版试题
- RS笔记:深度推荐模型之多任务学习PLE模型 [RecSys 2020 最佳论文 腾讯]
- 2020年,JavaScript开发人员必备的5项高薪技能
- 互动式教学在计算机课中应用,互动式教学模式在高中计算机教学中的应用
- SQLite管理工具推荐