【译】使用Picasso.Builder定制Picasso实例

使用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)来实现。它应该是一个实现了OkHttpDownloader接口的实例。

// 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的相关知识。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容