您的位置:首页 > 移动开发 > Android开发

Android图片加载框架Picasso最全使用教程 五

2016-04-04 13:39 766 查看
在之前的四篇博客中,我们学习了所有的关于Picasso的主要方法,我们也对这个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底层是怎么工作的,冰冻三尺非一日之寒,愿大家都有美好的一天~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: