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

fresco图片显示过程分析

SmipleDraweeView中的setImageURI方法中使用到了DraweeController,

public void setImageURI(Uri uri, @Nullable Object callerContext) {
DraweeController controller = mSimpleDraweeControllerBuilder
    .setCallerContext(callerContext)
    .setUri(uri)
    .setOldController(getController())
    .build();
setController(controller);
  }

代码中有个setController,该方法属于父类DraweeView,我们进去该方法看一下:

public void setController(@Nullable DraweeController draweeController) {
mDraweeHolder.setController(draweeController);
super.setImageDrawable(mDraweeHolder.getTopLevelDrawable());
  }

其中可以看出来,最终显示的图片就是mDraweeHolder.getTopLevelDrawable()得到的。在进去DraweeHolder中看一下:

public Drawable getTopLevelDrawable() {
return mHierarchy == null ? null : mHierarchy.getTopLevelDrawable();
  }

其中这个mHierarchy就是之前的GenericDraweeHierarchy类的一个对象。那么他的图片是从哪里来的呢,GenericDraweeHierarchy实现了一个接口SettableDraweeHierarchy,这个接口中定义了图片加载过程中包括成功,失败,错误时候的情况。我们看一下成功之后的回调接口:

  @Override
  public void setImage(Drawable drawable, float progress, boolean immediate) {
drawable = maybeApplyRoundingBitmapOnly(mRoundingParams, mResources, drawable);
drawable.mutate();
mActualImageSettableDrawable.setDrawable(drawable);
mFadeDrawable.beginBatchMode();
fadeOutBranches();
fadeInLayer(mActualImageIndex);
setProgress(progress);
if (immediate) {
  mFadeDrawable.finishTransitionImmediately();
}
mFadeDrawable.endBatchMode();
  }

上一段代码中就将得到的图片fadeInLayer,而其他站位图则都进行了fadeOut,所以此时getTopDrawable时,便是获取到的最新的图片。
那么又是什么时候去获取的图片呢,之前的文章中我们在仔细分析一下就会发现,在AbstractDraweeController中的Hierarchy便是直接诶使用的SettableDraweeHierarchy,也就是说,Controller中已经持有了SettableDraweeHierarchy的一个实例。

@Override
  public @Nullable
  DraweeHierarchy getHierarchy() {
return mSettableDraweeHierarchy;
  }

之后的就是上一篇文章中提到的,在AbstractDraweeController中如果发请求的话,会调用到submitRequest()方法,在此方法中会开线程去下载图片,如果图片下载成功回调至onNewResultImpl()方法中,紧接着又会执行到onNewResultInternal()方法中,这个方法中就会有这样一句:

mSettableDraweeHierarchy.setImage(drawable, 1f, wasImmediate);

此时之前的SimpleDraweeView中的Hierarvhy便有了真正的图片,而之前在显示的时候都是站位图,此时再获取的时候就会发现,topDrawable便开始有了真正的图片可以显示。
这样整个图片从请求到请求完成,到如何显示的流程便分析完成了。