美文网首页
简单从Picasso源码分析.into(target)和.fet

简单从Picasso源码分析.into(target)和.fet

作者: polelice | 来源:发表于2018-10-22 22:27 被阅读0次

Picasso的主要使用方法有3个:

  1. Picasso.with(context).load(xxx).into();
    .into(imageview,new Callback(){})直接把图片加载进imageview,并监听加载进度,获取到bitmap自行处理,源码如下:
public void into(ImageView target, Callback callback) {
     。。。。
    if (shouldReadFromMemoryCache(memoryPolicy)) {//是否需要从缓存中获取
      //从缓存中获取bitmap
      Bitmap bitmap = picasso.quickMemoryCacheCheck(requestKey);//
      if (bitmap != null) {//缓存成功
        picasso.cancelRequest(target);
        //调用PicassoDrawable的setBitmap方法
        setBitmap(target, picasso.context, bitmap, MEMORY, noFade, picasso.indicatorsEnabled);
        //加载完成回调
        if (callback != null) {
          callback.onSuccess();
        }
        return;
      }
    }
  }

2.Picasso.with(context).load(xxx).fetch();
fetch()/fetch(callback),传入callback会回调onComplete和onError函数源码如下

 @Override void complete(Bitmap result, Picasso.LoadedFrom from) {
    if (callback != null) {
      callback.onSuccess();
    }
  }
  @Override void error() {
    if (callback != null) {
      callback.onError();
    }
  }

当fetch方法不传入callback对象时候,fetch方法只是把bitmap存到缓存,什么的不做,这样当再次调用into(imageview)时候就会直接从缓存中拿bitmap,起到预加载图片的作用!
源码如下:

public void fetch(@Nullable Callback callback) {
      。。。省略部分代码。。
      //创建请求对象
      Request request = createRequest(started);
      if (shouldReadFromMemoryCache(memoryPolicy)) {//读取内存
        Bitmap bitmap = picasso.quickMemoryCacheCheck(key);
        if (bitmap != null) {
        //仍然是调用callback的onSuccess
          if (callback != null) {
            callback.onSuccess();
          }
          return;
        }
      }

      Action action =
          new FetchAction(picasso, request, memoryPolicy, networkPolicy, tag, key, callback);
      //提交action
      picasso.submit(action);
    }
  }

3.Picasso.with(context).load(xxx).get();
get()方法是picasso的一个同步方法可以通过该方法获得bitmap对象然后自行处理bitmap,且该方法不能再UI线程中使用
源码分析如下:

 public Bitmap get() throws IOException {
    checkNotMain();//确保是非UI线程
    。。。省略部分代码。。。
     Request finalData = createRequest(started);
    String key = createKey(finalData, new StringBuilder());
    //创建GetAction
    Action action = new GetAction(picasso, finalData, memoryPolicy, networkPolicy, tag, key);
    return forRequest(picasso, picasso.dispatcher, picasso.cache, picasso.stats, action).hunt();
  }

各位看官觉得分析不对的欢迎指出,谢谢!

相关文章

  • 简单从Picasso源码分析.into(target)和.fet

    Picasso的主要使用方法有3个: Picasso.with(context).load(xxx).into()...

  • Picasso源码阅读笔记

    一、Picasso简介 Picasso是Square出品的图片下载、缓存库。 二、Picasso源码分析 使用示例...

  • Glide源码(一)

    Picasso,Glide,Fresco对比 上一篇我们分析了Picasso,这一篇我们来分析Glide源码的调用...

  • Picasso中的多线程

    Picasso的使用及源码提交请求流程网上都已经很多了,本篇只分析Picasso中多线程相关 Picasso的线程...

  • Picasso源码

    我们知道,Glide和Picasso是两个非常优秀的图片加载框架,本篇先分析Picasso的源码,后面再用一篇文对...

  • Picasso源码分析和对比

    前面的 Android-Universal-Image-Loader源码分析[https://www.jiansh...

  • Picasso源码分析

    Picasso是一个由Square公司开源的强大的Android图片下载缓存库,仅仅只需要一行代码就可以实现图片的...

  • Picasso源码分析

    涉及到的设计模式1.单例2.Builder3.责任链模式 private Downloader downloade...

  • Picasso源码分析

    一 介绍 Square公司开源的图片加载库。优点是功能还算完善,能满足基本的图片加载需求,使用简单,体量轻易推倒。...

  • Picasso源码分析

网友评论

      本文标题:简单从Picasso源码分析.into(target)和.fet

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