Action代表的是一个具体的加载类。
里有一个静态内部类
static class RequestWeakReference<M> extends WeakReference<M> { final Action action; public RequestWeakReference(Action action, M referent, ReferenceQueue<? super M> q) { super(referent, q); this.action = action; } }
这里的referent,在ImageViewAction中传进来就是ImageView
Action主要定义了两个方法
abstract void complete(Bitmap result, Picasso.LoadedFrom from); abstract void error();
构造方法:
Action(Picasso picasso, T target, Request request, int memoryPolicy, int networkPolicy, int errorResId, Drawable errorDrawable, String key, Object tag, boolean noFade) { this.picasso = picasso; this.request = request; this.target = target == null ? null : new RequestWeakReference<T>(this, target, picasso.referenceQueue); this.memoryPolicy = memoryPolicy; this.networkPolicy = networkPolicy; this.noFade = noFade; this.errorResId = errorResId; this.errorDrawable = errorDrawable; this.key = key; this.tag = (tag != null ? tag : this); }
现在看子类ImageViewAction:
构造方法
ImageViewAction(Picasso picasso, ImageView imageView, Request data, int memoryPolicy, int networkPolicy, int errorResId, Drawable errorDrawable, String key, Object tag, Callback callback, boolean noFade) { super(picasso, imageView, data, memoryPolicy, networkPolicy, errorResId, errorDrawable, key, tag, noFade); this.callback = callback; }
@Override public void complete(Bitmap result, Picasso.LoadedFrom from) { if (result == null) { throw new AssertionError( String.format("Attempted to complete action with no result!\n%s", this)); } ImageView target = this.target.get(); //这是一个虚引用 if (target == null) { //如果imageview已经被回收了,直接返回 return; } Context context = picasso.context; boolean indicatorsEnabled = picasso.indicatorsEnabled; PicassoDrawable.setBitmap(target, context, result, from, noFade, indicatorsEnabled); if (callback != null) { callback.onSuccess(); } }