安卓Picasso实战体验--图片加载、缓存、回收新选择

50 篇文章 1 订阅
1 篇文章 0 订阅

转载请注明出处:http://blog.csdn.net/woshizisezise/article/details/51484278

大家好,很长一段时间没有更新文章了,忙着在适应自己的新工作,今天才偶尔得闲,能够给大家分享一点干货,当然了,我写的这篇文章没有像其他的大牛们分析的那么具体到位,主要是我个人对Picasso这个新的图片加载框架的使用体验和感受的一点分析,也会说到一点他的工作原理啦,那么我们就开始体验吧~

首先我们要知道,在安卓应用中,加载图片的框架不少,XUtils、Universal-Image-Loader、Volley、Fresco等都可以用来作为第三方框架,这些框架都为我们做了很好的图片资源优化的工作,第一次网络请求图片,内存缓存图片,本地缓存图片,自适应缩放图片加以展示,这些节省了我们的工作量,事实上,我们用这些框架开发我们的应用省去了优化的工作量,也避免了应用因这些元素没处理好而报OOM异常,那么我们今天要来介绍的Picasso和它们又有什么区别呢?下面从官网上的介绍来开始。

Picasso官网,好像需要翻墙才能打开,我截了张图,来看看介绍:

这里写图片描述

我们可以看到,我们可以按照下面这种写法来使用picasso,十分的简单:

Picasso.with(context).load(“http://i.imgur.com/DvpvklR.png“).into(imageView);

看到这里,我就觉得这是不是太简单啦,这简直是太轻松了吧,我们省去了像Universal-Image-Loader那样的配置环节,不用在Application里初始化,也不用设置一些Builder内容,就这么简单的一句话我们就可以实现加载图片了,简直是将上手程度降到最低了,实际上,它的操作程度正如我们看到的这么简单,让我们慢慢道来。

  • Adapter re-use is automatically detected and the previous download canceled.
@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);
}

这里介绍的是picasso的回收机制,它可以自动的回收并且取消先前的下载,这就保证了adapter的循环利用性,以及一些不必要的没有展示在前台的一些下载操作。

  • Transform images to better fit into layouts and to reduce memory size.
Picasso.with(context)
  .load(url)
  .resize(50, 50)
  .centerCrop()
  .into(imageView)

我们可以使用这样的方式来改变我们图片的大小,更好的适应我们的屏幕布局并且减少内存占用。

  • You can also specify custom transformations for more advanced effects.
public class CropSquareTransformation implements Transformation {
  @Override public Bitmap transform(Bitmap source) {
    int size = Math.min(source.getWidth(), source.getHeight());
    int x = (source.getWidth() - size) / 2;
    int y = (source.getHeight() - size) / 2;
    Bitmap result = Bitmap.createBitmap(source, x, y, size, size);
    if (result != source) {
      source.recycle();
    }
    return result;
  }

  @Override public String key() { return "square()"; }
}

我们还可以根据自己的需求,自定义一套适合自己的转变规则,比如说圆角、圆形……

  • Picasso supports both download and error placeholders as optional features.
Picasso.with(context)
    .load(url)
    .placeholder(R.drawable.user_placeholder)
    .error(R.drawable.user_placeholder_error)
    .into(imageView);

A request will be retried three times before the error placeholder is shown.

我们可以像给ImageLoader设置占位图那样给Picasso设置占位图,同时我们还可以给它设置一张加载出错的图片,当然它有前提是请求尝试过3次后仍然失败的,才会加载错误提示图。

  • Resources, assets, files, content providers are all supported as image sources.
Picasso.with(context).load(R.drawable.landing_screen).into(imageView1);
Picasso.with(context).load("file:///android_asset/DvpvklR.png").into(imageView2);
Picasso.with(context).load(new File(...)).into(imageView3);

Picasso还可以加载资源图片,assets图片,文件图片,content provider里的图片,它都可以支持,兼容面还是非常广的。

好了,说了这么多,不如实际来体验一下吧,我创建了一个很简单的工程,在网上copy了一些图片网址,然后用Picasso加载,从加载体验和展示效果上来说,还是很棒的,并且在上下滑动加载回收项的时候,可以有瞬间可以看到是从回收中打开的条目,优化做的不错,下面是工程代码:

public class MainActivity extends AppCompatActivity {

    private ListView listview;
    private List<String> imgLists;
    private Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        context = MainActivity.this;
        initDatas();
        listview = (ListView) findViewById(R.id.listview);
        listview.setAdapter(new MyAdapter());
    }

    private void initDatas() {
        imgLists = new ArrayList<String>();
        imgLists.add("http://att.bbs.duowan.com/forum/201403/29/1905260ittk00atvvrog0b.jpg");
       imgLists.add("http://pic35.nipic.com/20131117/13761370_113517130000_2.png");
   imgLists.add("http://imgsrc.baidu.com/baike/pic/item/964b2e4e2ec80286d0c86a00.jpg");
        imgLists.add("http://pic42.nipic.com/20140605/18641501_160421864000_2.jpg");
        imgLists.add("http://img2.3lian.com/2014/f2/43/d/83.jpg");
    }

    public class MyAdapter extends BaseAdapter{

        @Override
        public int getCount() {
            return imgLists.size();
        }

        @Override
        public String getItem(int position) {
            return imgLists.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null){
                holder = new ViewHolder();
                convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.layout_item,null);
                holder.imageview = (ImageView)convertView.findViewById(R.id.image);
                convertView.setTag(holder);
            }else {
                holder = (ViewHolder)convertView.getTag();
            }

            String url = getItem(position);

            Picasso.with(context).load(url).into(holder.imageview);

            return convertView;
        }
    }

    class ViewHolder{
        ImageView imageview;
    }
}

最终效果图:

这里写图片描述

大家伙可以动手试试,说不定会颠覆你以前的观点,爱上它呢?

  • 希望大家关注我更多的博客,我会不定期更新更多的内容,欢迎大家订阅公众号,我会不定期更新资源,供大家一起学习,一起进步。

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
PicassoAndroid系统的图片下载和缓存类库 Picasso 是Square开源的一个用于Android系统下载和缓存图片的项目。该项目和其他一些下载图片项目的主要区别之一是:使用4.0+系统上的HTTP缓存来代替磁盘缓存Picasso 的使用是非常简单的,例如: 帮助 1 Picasso.with(context).load("http://i.imgur.com/DvpvklR.png.into(imageView")); Picasso有如下特性: 处理Adapter中的 ImageView 回收和取消已经回收ImageView的下载进程 使用最少的内存完成复杂的图片转换,比如把下载的图片转换为圆角等 自动添加磁盘和内存缓存 具体介绍 在Adapter中下载 自动检测Adapter中的ImageView重用和取消不必要的下载 帮助 01.@Override public void getView(int position, View convertView, ViewGroup parent) { 02.SquaredImageView view = (SquaredImageView) convertView; 03.if (view == null) { 04.view = new SquaredImageView(context); 05.} 06.String url = getItem(position);Picasso.with(context).load(url).into(view); 07.} 复制代码 图片转换 转换图片以适合所显示的ImageView,来减少内存消耗 帮助 01.Picasso.with(context) 02..load(url) 03..resize(50, 50) 04..centerCrop() 05..into(imageView) 复制代码 还可以设置自定义转换来实现高级效果,例如下面的矩形特效(把图片居中裁剪为矩形) 帮助 01.public class CropSquareTransformation implements Transformation { 02.@Override public Bitmap transform(Bitmap source) { 03.int size = Math.min(source.getWidth(), source.getHeight()); 04.int x = (source.getWidth() - size) / 2; 05.int y = (source.getHeight() - size) / 2; 06.Bitmap result = Bitmap.createBitmap(source, x, y, size, size); 07.if (result != source) { 08.source.recycle(); 09.} 10.return result; 11.}@Override public String key() { return "square()"; } 12.} 复制代码 用该类示例调用函数 RequestBuilder.transform(Transformation) 即可。 占位符图片 Picasso支持下载和加载错误占位符图片。 帮助 Picasso.with(context) .load(url) .placeholder(R.drawable.user_placeholder) .error(R.drawable.user_placeholder_error) .into(imageView); 如果重试3次(下载源代码可以根据需要修改)还是无法成功加载图片 则用错误占位符图片显示。 支持本地资源加载 从 Resources, assets, files, content providers 加载图片都支持 Picasso.with(context).load(R.drawable.landing_screen).into(imageView1); Picasso.with(context).load(new File("/images/oprah_bees.gif")).into(imageView2); 调试支持 调用函数 Picasso.setDebug(true) 可以在加载图片左上角显示一个 三角形 ,不同的颜色代表加载的来源 红色:代表从网络下载的图片 黄色:代表从磁盘缓存加载图片 绿色:代表从内存中加载图片 如果项目中使用了OkHttp库的话,默认会使用OkHttp来下载图片。否则使用HttpUrlConnection来下载图片

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖子爱你520

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值