zoukankan      html  css  js  c++  java
  • Android图片加载框架Picasso最全使用教程5

    在之前的四篇博客中,我们学习了所有的关于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,实现里面的两个抽象方法

    1. boolean canHandleRequest(Request data) : 该方法是为了让Picasso来判断当前的request handler是否能处理现在的请求,如果可以,就去调用load()方法

    2. 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底层是怎么工作的,冰冻三尺非一日之寒,愿大家都有美好的一天~

  • 相关阅读:
    UE4美术之数学基础知识(一)
    如何用Unity制作逼真的自然场景?
    git拉取和上传项目代码
    Chaosblade-故障使用工具
    如何对数据库做优化
    分布式和集群的概念
    token、cookie、session的区别
    Json中的json.tojsonString()方法
    JSON的put方法
    fastjson中的相关方法
  • 原文地址:https://www.cnblogs.com/simadi/p/6707482.html
Copyright © 2011-2022 走看看