Android图片加载框架Picasso使用教程 (五)

在之前的四篇博客中,我们学习了所有的关于Picasso的主要方法,我们也对这个Picasso有了一个很深的认识,下面就主要对Picasso自身进行分析,这样的话,会让我们更了解Picasso的核心方法;


ps:更多学习资料可加QQ1692250804获取!


创建一个Picasso

Picasso有一个直接的方法去创建一个它的实例,就是Picasso.Builder,这样可以创建属于我们自己的Picasso,而不是使用一个标准的Picasso;


标准创建方式

我们最常用的就是直接调用Picasso.with(context);就能返回一个Picasso实例,这就是一个标准的Picasso,很简单;


  1. <font color="rgb(85, 85, 85)">Picasso picasso = Picasso.with(context);</font>
复制代码

自定义创建实例

自定义就是调用Picasso.Builder,这是一个我们自己的Picasso,当然,也默认也实现的是标准的Picasso的所有功能,我们也可以像用标准的Picasso一样进行使用;


  1. <font color="rgb(85, 85, 85)">Picasso.Builder picassoBuilder = new Picasso.Builder(context);
  2. Picasso picasso = picassoBuilder.build();  
  3. picasso  
  4.     .load(UsageExampleListViewAdapter.eatFoodyImages[0])
  5.     .into(imageView1);</font>
复制代码


将自定义Picasso变成全局使用

我们可以在应用启动的时候调用Picasso.setSingletonInstance(picasso);,这样的话后面所有的调用Picasso.with(context)返回的都是我们自定义的Picasso;


  1. <font color="rgb(85, 85, 85)">try{
  2.     Picasso.Builder picassoBuilder = new Picasso.Builder(context);
  3.     Picasso picasso = picassoBuilder.build();  
  4.     Picasso.setSingletonInstance(picasso);
  5. }catch(IllegalStateException ignored){
  6.     //Picasso示例已经被设置过时会出现该异常
  7.     //在Picasso.with(context)调用之后进行设置也会出现该异常
  8. }</font>
复制代码


更改Picasso中的Downloader

如果你想更换默认的Downloader,你可以通过Picasso.Builder调用.downloader(Downloader downloader),传入一个实现Downloader的实现类,比如OkHttpDownloader,上代码:


  1. <font color="rgb(85, 85, 85)">Picasso.Builder picassoBuilder = new Picasso.Builder(context);

  2. //在创建Picasso的示例之前更改downloader
  3. picassoBuilder.downloader(new OkHttpDownloader(new OkHttpClient()));

  4. // 创建实例
  5. Picasso picasso = picassoBuilder.build();

  6. picasso  
  7.    .load(UsageExampleListViewAdapter.eatFoodyImages[2])
  8.    .into(imageView3);</font>
复制代码

但是有一个需要注意的地方,如果你加载的图片是从自己服务器上获取的,而且服务器用的是HTTPS,而且需要一个签名,这个时候OKHttp就会因为SSL的问题而导致图片无法被加载,这时你可以选择使用UnsafeOkHttpClient,就可以避免该问题的产生;


  1. <font color="rgb(85, 85, 85)">picassoBuilder.downloader(  
  2.     new OkHttpDownloader(
  3.         UnsafeOkHttpClient.getUnsafeOkHttpClient()
  4.     )
  5. );</font>
复制代码


内存缓存自定义及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) : 处理请求

示例代码:


  1. <font color="rgb(85, 85, 85)">/**
  2. * 自定义一个类来继承RequestHandler
  3. */
  4. public class EatFoodyRequestHandler extends RequestHandler {  
  5.     private static final String EAT_FOODY_RECIPE_SCHEME = "eatfoody";

  6.     @Override
  7.     public boolean canHandleRequest(Request data) {
  8.         //判断当前请求是否是自定义的URI (eg:eatfoody://cupcake)  ,如果是就会调用load方法
  9.         return EAT_FOODY_RECIPE_SCHEME.equals(data.uri.getScheme());
  10.     }

  11.     @Override
  12.     public Result load(Request request, int networkPolicy) throws IOException {
  13.        // 我们可以进行网络请求或者进行本地加载,然后返回一个Result

  14.        // 从请求中获取一个key值
  15.        // 如果自定义URI为: "eatfoody://cupcake", key的值为 "cupcake"
  16.        String imageKey = request.uri.getHost();

  17.        Bitmap bitmap;
  18.         //加载本地图片
  19.        if (imageKey.contentEquals("cupcake")) {
  20.            bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.cupcake);
  21.        }
  22.        else if (imageKey.contentEquals("full_cake")) {
  23.            bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.full_cake);
  24.        }
  25.        else {

  26.            bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
  27.        }

  28.        // 返回一个result
  29.        return new Result(bitmap, Picasso.LoadedFrom.DISK);
  30.     }
  31. }

  32. //在Picasso中使用也很简单
  33. Picasso.Builder picassoBuilder = new Picasso.Builder(context);

  34. picassoBuilder.addRequestHandler(new EatFoodyRequestHandler());

  35. Picasso picasso = picassoBuilder.build();

  36. //这是我们之前写的请求图片代码
  37. //  picasso  
  38. //    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
  39. //    .into(imageView1);

  40. //如果使用了自定义的URI进行请求,就可以这样写,是不是很简单
  41. picasso  
  42.     .load("eatfoody://cupcake")
  43.     .into(imageView2);

  44. picasso  
  45.     .load("eatfoody://full_cake")
  46.     .into(imageView3);</font>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值