Android图片加载框架Fresco分析(八)

Fresco的图片显示流程:

DraweeView中的OnAttachedToWindow()方法中,会调用到DraweeHolder的onAttach()方法。DraweeHolder相当于View的管家。通过这个方法看出来,View在attached的时候就已经调用了holder的onAttach,而在这个onAttach中又会调用到attachController方法,进而调用controller的onAttach的方法。再进去看一下controller的attach方法里做了什么

@Override
public void onAttach() {
  if (FLog.isLoggable(FLog.VERBOSE)) {
    FLog.v(
        TAG,
        "controller %x %s: onAttach: %s",
        System.identityHashCode(this),
        mId,
        mIsRequestSubmitted ? "request already submitted" : "request needs submit");
  }
  mEventTracker.recordEvent(Event.ON_ATTACH_CONTROLLER);
  Preconditions.checkNotNull(mSettableDraweeHierarchy);
  mDeferredReleaser.cancelDeferredRelease(this);
  mIsAttached = true;
  if (!mIsRequestSubmitted) {
    submitRequest();
  }
}

controller的onAttach方法出现在抽象类(AbstractDraweeController)中,在这里明显能够看出来submitRequest()调用了请求去下载图片。

进到submitRequest方法中的代码可以看到一个mSettableDraweeHierarchy,这个Hierarchy是从SimpleDraweeView的父类GenericDraweeView里之前设置好的。同时,controller也会持有这个Hierarchy(之前说明过hierarchy就是用来显示图片和加载进度等)。再往下可以看到

mDataSource = getDataSource();

getDataSource便是将之前解析五中的流程都走了一遍。相当于得到了DataSource。其实最开始是很多的Producer,之后通过ProducerToDataSourceAdapter类将Producer转换成了DataSource。