美文网首页第三方框架的学习ZK安卓开发工具箱Android学习
Android图片加载库:最全面的Picasso讲解

Android图片加载库:最全面的Picasso讲解

作者: Carson带你学安卓 | 来源:发表于2016-09-01 17:13 被阅读16697次

    前言

    • 上文已经对当今Android主流的图片加载库进行了全面介绍 & 对比

    如果你还没阅读,我建议你先移步这里阅读

    • 今天我们来学习其中一个Android主流的图片加载库的使用 - Picasso

    目录

    目录

    1. 简介

    • 介绍:Picasso,可译为“毕加索”,是Android中一个图片加载开源库

    大概是因为其使用使用方法简单、优雅所以这样取名

    • 主要作用:实现图片加载

    2. 功能特点

    2.1 功能列表

    功能列表
    • 从上面可以看出,Picasso不仅实现了图片异步加载的功能,还解决了Android中加载图片时需要解决的一些常见问题
    • 接下来,我会对Picasso的每个功能点进行详细的介绍

    2.2 功能介绍

    2.2.1 图片的异步加载(最基础功能)

    ImageView targetImageView = (ImageView) findViewById(R.id.ImageView);
            String Url = "http://218.192.170.132/1.jpg";
    
    //Picasso使用了流式接口的调用方式
    //Picasso类是核心实现类。
    //实现图片加载功能至少需要三个参数:
            Picasso
    //with(Context context)
    //Context对于很多Android API的调用都是必须的,这里就不多说了
                    .with(context)
    
    //load(String imageUrl):被加载图像的Url地址。
    //大多情况下,一个字符串代表一个网络图片的URL。
                    .load(Url)
    
    //into(ImageView targetImageView):图片最终要展示的地方。
                    .into(targetImageView);
    

    2.2.2 图片转换
    使用最少的内存完成复杂的图片转换,转换图片以适合所显示的ImageView,来减少内存消耗

    Picasso.with(context)
      .load(url)
    //裁剪图片尺寸
      .resize(50, 50)
    //设置图片圆角
      .centerCrop()
      .into(imageView)
    

    2.2.3 加载过重 & 错误处理
    Picasso支持加载过程中和加载错误时显示对应图片

    Picasso.with(context)
        .load(url)
    //加载过程中的图片显示
        .placeholder(R.drawable.user_placeholder)
    //加载失败中的图片显示
    //如果重试3次(下载源代码可以根据需要修改)还是无法成功加载图片,则用错误占位符图片显示。
        .error(R.drawable.user_placeholder_error)
        .into(imageView);
    

    2.2.4 在Adapter中的回收不在视野的ImageView和取消已经回收的ImageView下载进程

    @Override 
    public void getView(int position, View convertView, ViewGroup parent) {
      SquaredImageView view = (SquaredImageView) convertView;
      if (view == null) {
        view = new SquaredImageView(context);
      }
      String url = getItem(position);
     
      Picasso.with(context).load(url).into(view);
    }
    

    2.2.5 从不同资源源加载
    支持多种数据源 网络、本地、资源、Assets 等

    //加载资源文件
    Picasso.with(context).load(R.drawable.landing_screen).into(imageView1);
    //加载本地文件
    Picasso.with(context).load(new File("/images/oprah_bees.gif")).into(imageView2);
    
    

    2.2.6 自动添加磁盘和内存二级缓存功能

    2.2.7 支持优先级处理
    每次任务调度前会选择优先级高的任务,比如 App 页面中 Banner 的优先级高于 Icon 时就很适用。

    2.2.8 支持飞行模式、并发线程数根据网络类型而变
    手机切换到飞行模式或网络类型变换时会自动调整线程池最大并发数,比如 wifi 最大并发为 4, 4g 为 3,3g 为 2

    2.2.9 “无”本地缓存
    无”本地缓存,不是说没有本地缓存,而是 Picasso 自己没有实现,交给了 Square 的另外一个网络库 okhttp 去实现,这样的好处是可以通过请求 Response Header 中的 Cache-Control 及 Expired 控制图片的过期时间。

    3. Demo实例

    没有Demo的代码讲解不是好文章,让我们来一步步学会使用Picasso。

    步骤1:在gradle添加依赖

    compile 'com.squareup.picasso:picasso:2.5.2'
    

    步骤2:添加网络权限

    <uses-permission android:name="android.permission.INTERNET"/>
    

    步骤1和步骤2是Picasso使用的前提,千万别忘了!!!!

    步骤3:在MainActivity中

    ImageView targetImageView = (ImageView) findViewById(R.id.ImageView);
            String Url = "http://218.192.170.132/1.jpg";
    
            Picasso
                    .with(this)
                    .load(Url)
                    .into(targetImageView);
    

    还有具体其他功能需要配置的自己按照我上面写的进行配置就好了~

    这里再贴上Picasso的Github地址:请点击这里

    4. 特点

    4.1 优点

    • 使用简单、方便(一行代码的事情)
    • 由于同样是出品自Square的,Square 公司的其他开源库如 Retrofit 或者 OkHttp和Picasso搭配使用兼容性会更好些,占用体积也会少些

    所以,如果项目已经使用了 Square 公司的其他开源库(如 Retrofit 或者 OkHttp),在满足需求的前提下建议使用Picasso

    4.2 缺点

    • 功能较为简单-图片加载;
    • 性能(加载速度等等)较其他图片加载库(Glide、Fresco)较差
    • 自身无实现“本地缓存”

    5. 总结

    • Picasso使用起来是不是非常简单?相信你看完这篇文章后你能全面掌握Picasso的用法
    • 但是Picasso的源码却不简单,接下来我会对Picasso的源码进行详细分析,如果感兴趣的话请继续关注Carson_Ho的安卓开发笔记

    CSDN博客已同步发布


    请点赞!因为你的鼓励是我写作的最大动力!

    相关文章阅读
    Android主流的图片加载库
    Android图片加载库:最全面解析Glide用法
    Android开发:最全面、最易懂的Android屏幕适配解决方案
    Android开发:Handler异步通信机制全面解析(包含Looper、Message Queue)
    Android开发:顶部Tab导航栏实现(TabLayout+ViewPager+Fragment)
    Android开发:底部Tab菜单栏实现(FragmentTabHost+ViewPager)
    Android开发:JSON简介及最全面解析方法!
    Android开发:XML简介及DOM、SAX、PULL解析对比


    欢迎关注Carson_Ho的简书!

    不定期分享关于安卓开发的干货,追求短、平、快,但却不缺深度

    相关文章

      网友评论

      • 银月银月:ExifInterface: Invalid image.
        java.io.IOException: Invalid marker: 89
        at android.media.ExifInterface.getJpegAttributes(ExifInterface.java:1598)
        at android.media.ExifInterface.loadAttributes(ExifInterface.java:1334)
        at android.media.ExifInterface.<init>(ExifInterface.java:1052)
        at com.squareup.picasso.FileRequestHandler.getFileExifRotation(FileRequestHandler.java:46)
        at com.squareup.picasso.FileRequestHandler.load(FileRequestHandler.java:42)
        at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:206)
        at com.squareup.picasso.BitmapHunter.run(BitmapHunter.java:159)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:841)
        at com.squareup.picasso.Utils$PicassoThread.run(Utils.java:411)
        银月银月:使用的时候报这个错,百度也没找到方法解决 求指教
      • allenZP:支持同步加载图片吗
      • 0861bad599ad:Picasso是否支持加载动态图?
        Carson带你学安卓: @李伟健 不可以哦
      • 剑柳吟风:你好,请问您说的 Picasso “无”本地缓存,该如何理解?我只引入 picasso包时,没有引入okhttp包,但是我发现只要第一次加载之后,即使断掉网络,第二次进入之后还是可以加载出来的啊!
        还有一点,您说的 2.2.9 “无”本地缓存, 和 2.2.6 自动添加磁盘和内存二级缓存功能 这两点是不是有点矛盾,还是我理解有误,还请指教。Thanks!
        zkxok:我也这么觉得,没解释清楚
        c24ff96eddb3: 2.2.9 “无”本地缓存是用的okhttp库里的缓存,picasso没有自己实现缓存
      • 汪珺:我有个问题Picasso支持加载gif图片了?我以前用的时候好像是不支持的
        路人丁Coco:Picasso 不支持 gif

      本文标题:Android图片加载库:最全面的Picasso讲解

      本文链接:https://www.haomeiwen.com/subject/wrnsjttx.html