Android图片加载框架Picasso最全使用教程 五
2016-04-04 13:39
766 查看
在之前的四篇博客中,我们学习了所有的关于Picasso的主要方法,我们也对这个Picasso有了一个很深的认识,下面就主要对Picasso自身进行分析,这样的话,会让我们更了解Picasso的核心方法;
但是有一个需要注意的地方,如果你加载的图片是从自己服务器上获取的,而且服务器用的是HTTPS,而且需要一个签名,这个时候
内存缓存自定义及
自定义
首先需要我们自定义一个类来继承抽象类
示例代码:
OK,到此,我们关于Picasso的用法已经全部介绍完毕,随后一篇我们将对Picasso的原理进行剖析,来看Picasso底层是怎么工作的,冰冻三尺非一日之寒,愿大家都有美好的一天~
创建一个Picasso
Picasso有一个直接的方法去创建一个它的实例,就是Picasso.Builder,这样可以创建属于我们自己的Picasso,而不是使用一个标准的Picasso;
标准创建方式
我们最常用的就是直接调用Picasso.with(context);就能返回一个Picasso实例,这就是一个标准的Picasso,很简单;
Picasso picasso = Picasso.with(context);
自定义创建实例
自定义就是调用Picasso.Builder,这是一个我们自己的Picasso,当然,也默认也实现的是标准的Picasso的所有功能,我们也可以像用标准的Picasso一样进行使用;
Picasso.Builder picassoBuilder = new Picasso.Builder(context); Picasso picasso = picassoBuilder.build(); picasso .load(UsageExampleListViewAdapter.eatFoodyImages[0]) .into(imageView1);
将自定义Picasso变成全局使用
我们可以在应用启动的时候调用Picasso.setSingletonInstance(picasso);,这样的话后面所有的调用
Picasso.with(context)返回的都是我们自定义的Picasso;
try{ Picasso.Builder picassoBuilder = new Picasso.Builder(context); Picasso picasso = picassoBuilder.build(); Picasso.setSingletonInstance(picasso); }catch(IllegalStateException ignored){ //Picasso示例已经被设置过时会出现该异常 //在Picasso.with(context)调用之后进行设置也会出现该异常 }
更改Picasso中的Downloader
如果你想更换默认的Downloader,你可以通过
Picasso.Builder调用
.downloader(Downloader downloader),传入一个实现
Downloader的实现类,比如
OkHttpDownloader,上代码:
Picasso.Builder picassoBuilder = new Picasso.Builder(context); //在创建Picasso的示例之前更改downloader picassoBuilder.downloader(new OkHttpDownloader(new OkHttpClient())); // 创建实例 Picasso picasso = picassoBuilder.build(); picasso .load(UsageExampleListViewAdapter.eatFoodyImages[2]) .into(imageView3);
但是有一个需要注意的地方,如果你加载的图片是从自己服务器上获取的,而且服务器用的是HTTPS,而且需要一个签名,这个时候
OKHttp就会因为
SSL的问题而导致图片无法被加载,这时你可以选择使用
UnsafeOkHttpClient,就可以避免该问题的产生;
picassoBuilder.downloader( new OkHttpDownloader( UnsafeOkHttpClient.getUnsafeOkHttpClient() ) );
内存缓存自定义及Request Handlers
Memory Cache- 如果你不满足系统默认的15%的可用空间的内存缓存大小,可以根据
Picasso.Builder来自定义设置
Request Handlers- 如果你习惯于一个自定义URI的形式(内容提供者)进行图片访问,这里会提供一个很强大的工具,Request Handlers
自定义Request Handlers
首先需要我们自定义一个类来继承抽象类RequestHandler,实现里面的两个抽象方法
boolean canHandleRequest(Request data): 该方法是为了让Picasso来判断当前的
request handler是否能处理现在的请求,如果可以,就去调用
load()方法
Result load(Request request, int networkPolicy): 处理请求
示例代码:
/** * 自定义一个类来继承RequestHandler */ public class EatFoodyRequestHandler extends RequestHandler { private static final String EAT_FOODY_RECIPE_SCHEME = "eatfoody"; @Override public boolean canHandleRequest(Request data) { //判断当前请求是否是自定义的URI (eg:eatfoody://cupcake) ,如果是就会调用load方法 return EAT_FOODY_RECIPE_SCHEME.equals(data.uri.getScheme()); } @Override public Result load(Request request, int networkPolicy) throws IOException { // 我们可以进行网络请求或者进行本地加载,然后返回一个Result // 从请求中获取一个key值 // 如果自定义URI为: "eatfoody://cupcake", key的值为 "cupcake" String imageKey = request.uri.getHost(); Bitmap bitmap; //加载本地图片 if (imageKey.contentEquals("cupcake")) { bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.cupcake); } else if (imageKey.contentEquals("full_cake")) { bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.full_cake); } else { bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher); } // 返回一个result return new Result(bitmap, Picasso.LoadedFrom.DISK); } } //在Picasso中使用也很简单 Picasso.Builder picassoBuilder = new Picasso.Builder(context); picassoBuilder.addRequestHandler(new EatFoodyRequestHandler()); Picasso picasso = picassoBuilder.build(); //这是我们之前写的请求图片代码 // picasso // .load(UsageExampleListViewAdapter.eatFoodyImages[0]) // .into(imageView1); //如果使用了自定义的URI进行请求,就可以这样写,是不是很简单 picasso .load("eatfoody://cupcake") .into(imageView2); picasso .load("eatfoody://full_cake") .into(imageView3);
OK,到此,我们关于Picasso的用法已经全部介绍完毕,随后一篇我们将对Picasso的原理进行剖析,来看Picasso底层是怎么工作的,冰冻三尺非一日之寒,愿大家都有美好的一天~
相关文章推荐
- Android学习之界面篇(四)自定义Animation
- Android Support Library 23.2
- Announcing the 2016 Android Experiments I/O Challenge!
- Android课程---final关键字
- AndroidStudio 集成海康威视 Android SDK,集成萤石Android SDK。
- Android Gradle Plugin指南(一)——简介
- Android EventBus的基本使用
- Android应用自定义View绘制方法手册
- Android通过来电号码识别姓名。
- Android焦点分发基本流程
- 萤石Android SDK 集成到AndroidStudio的时候报错,Tag <activity> attribute name has invalid character ' '.
- Android学习之界面篇(三)LayoutAnimationController详细介绍
- Android 学习记录-ImageView显示格式
- Android焦点分发基础
- Android中使用PreferenceActivity创建菜单
- Android属性动画
- 遇到问题----Android----ActivityManager: Error: Activity class {xx/xx.MainActivity} does not exist
- 遇到问题----Android----ActivityManager: Error: Activity class {xx/xx.MainActivity} does not exist
- 在一个应用中打开另一个应用
- Android开发实用技巧之四:自定义ActivityCollector来管理活动