desmond1121 / Fresco-Source-Analysis

中文的Fresco源码解读
862 stars 127 forks source link

fresco从缓存或者网络加载数据的cancel机制的疑问 #5

Closed ming2d941 closed 8 years ago

ming2d941 commented 8 years ago

最近大体看了看fresco的实现,有很多地方不太清楚,比如对从缓存或者网络加载数据时的cancel机制比较疑惑。 拿界面上来说,比如有一个listview在不停的滚动,已经滚出屏幕外但是还没加载完,fresco能不能把这部分请求取消掉呢? 请教fresco能不能做到上面的功能,有没有cancel机制呢,是怎样的呢?还望指导... : )

ming2d941 commented 8 years ago

哦,看了下是可以的,AbstractDraweeController的onDetach()方法:

  @Override
    public void onDetach() {
      if (FLog.isLoggable(FLog.VERBOSE)) {
        FLog.v(TAG, "controller %x %s: onDetach", System.identityHashCode(this), mId);
      }
      mEventTracker.recordEvent(Event.ON_DETACH_CONTROLLER);
      mIsAttached = false;
      mDeferredReleaser.scheduleDeferredRelease(this);
    }

view被detach后会通过scheduleDeferredRelease来取消请求。

还有一处是在setController()提交请求时,会在调用到的setHierarchy()中取消请求:

  public void setHierarchy(@Nullable DraweeHierarchy hierarchy) {
    //省略部分代码
    // force release in case request was submitted
    if (mIsRequestSubmitted) {
      mDeferredReleaser.cancelDeferredRelease(this);
      release();
    }
    //省略部分代码
  }
desmond1121 commented 8 years ago

@ming2d941 是的,它会自动detach,但是有个地方需要注意,如果是ViewPager,左右滑出的DraweeView是不会被detach掉的