- 原文链接: Customizing Picasso with Picasso.Builder
- 原文作者: Future Studio
- 译文出自: 小鄧子的简书
- 译者: 小鄧子
- 状态: 完成
使用Picasso.Builder定制Picasso
可以通过Picasso.Builder 直接修改Picasso实例。我们将使用Picasso.Builder
来创建自定义的Picasso实例。新的Picasso实例可能替换了多个组件。在看有哪些可替换组件之前,让我们先来了解一下如何创建一个自定义的Picasso实例。
自定义局部实例
在创建自定义Picasso实例之前,让我们简单的了解下,到目前为止,我们是如何拿到标准Picasso实例的:
Picasso picasso = Picasso.with(Context);
Picasso.with(Context context)
始终返回标准的Picasso实例。如果需要自定义实例,一种方式是创建Picasso.Builder
对象,添加你需要的配置,然后构建出Picasso实例。
// create Picasso.Builder object
Picasso.Builder picassoBuilder = new Picasso.Builder(context);
// todo make your adjustments here (will do in a minute)
// Picasso.Builder creates the Picasso object to do the actual requests
Picasso picasso = picassoBuilder.build();
新创建出的Picasso对象,与标准Picasso拥有相同的功能。
// instead of Picasso.with(Context context) you directly use this new custom Picasso object
picasso
.load(UsageExampleListViewAdapter.eatFoodyImages[0])
.into(imageView1);
如果你希望Picasso在所有的请求上,都能表现出一个特殊的行为,那么就需要将你的自定义实例,设置为全局实例。
自定义全局实例
创建和修改Picasso实例的方式保持不变:
// create Picasso.Builder object
Picasso.Builder picassoBuilder = new Picasso.Builder(context);
// Picasso.Builder creates the Picasso object to do the actual requests
Picasso picasso = picassoBuilder.build();
调用Picasso.setSingletonInstance(picasso)
将这个自定义Picasso实例,设置为全局实例。需要牢记的是,你只能在Picasso请求前调用这个方法,原则上讲,应该在应用启动时调用。
// set the global instance to use this Picasso object
// all following Picasso (with Picasso.with(Context context) requests will use this Picasso object
// you can only use the setSingletonInstance() method once!
try {
Picasso.setSingletonInstance(picasso);
} catch (IllegalStateException ignored) {
// Picasso instance was already set
// cannot set it after Picasso.with(Context) was already in use
}
一旦在应用启动时这样做,所有通过调用Picasso.with(Context context)
返回的对象都是你自定义的那个Picasso实例。
// you can continue to use Picasso.with(Context context), but it'll return your custom instance
Picasso
.with(context)
.load(UsageExampleListViewAdapter.eatFoodyImages[1])
.into(imageView2);
你还需要考虑的是,哪些选项才是真正适合你的项目工程的。为了方便你的决定,我们将向您展示一个可以定制的Picasso行为:替换网络组件.
影响Picasso行为:替换下载组件
Picasso将默认使用最佳化的缓存和下载组件。如果你有足够的理由为Picasso制定一个特殊的下载组件,可以在Picasso.Builder
上调用.downloader(Downloader downloader)
来实现。它应该是一个实现了OkHttp的Downloader接口的实例。
// create Picasso.Builder object
Picasso.Builder picassoBuilder = new Picasso.Builder(context);
// let's change the standard behavior before we create the Picasso instance
// for example, let's switch out the standard downloader for the OkHttpClient
picassoBuilder.downloader(new OkHttpDownloader(new OkHttpClient()));
// Picasso.Builder creates the Picasso object to do the actual requests
Picasso picasso = picassoBuilder.build();
picasso
.load(UsageExampleListViewAdapter.eatFoodyImages[2])
.into(imageView3);
由于Picasso会优先选择OKHttp(如果可用的话),因此这并没有什么实际意义。我们通过一个实际例子,来描述如下真实存在的场景:服务请求使用HTTPS,但同时还存在一个自签名的证书验证。由于SSL证书的问题,标准的OKHttp实现将会拒绝这个连接请求,带来的后果的就是无法下载图片,然后ImageView
也是空的。
你可以通过一个OkHttp实现来修复这个问题,这个实现类将忽略HTTPS自身存在的问题。设置这个HTTP实例到你的Picasso下载器中,即便在自签名HTTPS环境中,也依然能正确的显示图片。
picassoBuilder.downloader(
new OkHttpDownloader(
UnsafeOkHttpClient.getUnsafeOkHttpClient()
)
);
必须要提醒的是:这会忽略所有的安全检查,所以在使用网络组件之前,请一定明确知道自己在做什么。
进一步自定义
除了下载器之外,Picasso.Builder
还提供了许多可自定义的属性。在我们看来这以下两个是最有趣的:
Memory Cache: 如果你不认可标准设置(应用可用RAM的15%作为内存缓存),你可以实现自己的缓存策略,然后添加到
Picasso.Builder
上。Request Handlers: 如果你所请求的图像,是一个自定义Uri格式的地址,那么
Request Handler
则是你强有力的工具。下一篇博客将会介绍有关Request Handler
的相关知识。