Android随笔

Fresco源码解析

2018-03-07  本文已影响0人  TheoT

解码策略

5.0以上版本使用ArtDecoder,4.4以下使用GingerbreadPurgeableDecoder,4.4到5.0之间使用KitKatPurgeableDecoder。(GingerbreadPurgeableDecoder与KitKatPurgeableDecoder为DalvikPurgeableDecoder子类)

  public static PlatformDecoder buildPlatformDecoder(
      PoolFactory poolFactory,
      boolean directWebpDirectDecodingEnabled) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
      int maxNumThreads = poolFactory.getFlexByteArrayPoolMaxNumThreads();
      return new ArtDecoder(
          poolFactory.getBitmapPool(),
          maxNumThreads,
          new Pools.SynchronizedPool<>(maxNumThreads));
    } else {
      if (directWebpDirectDecodingEnabled
          && Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
        return new GingerbreadPurgeableDecoder();
      } else {
        return new KitKatPurgeableDecoder(poolFactory.getFlexByteArrayPool());
      }
    }
  }

内存简述

基本原理参照google BITMAP内存管理

以下为fresco内存池获取内存策略

public V get(int size) {
    ...
    //依据不同类型Bucket池获取Bucket大小
    int bucketedSize = getBucketedSize(size);
    int sizeInBytes = -1;
    synchronized (this) {
     //获取Bucket池中符合需要bucketSize的Bucket
      Bucket<V> bucket = getBucket(bucketedSize);
      if (bucket != null) {
        //从Bucket池中找到可以复用的内存返回使用
        V value = bucket.get();
        ...
        return value;
        }
        // fall through
      }
    ...
    V value = null;
    try {
      ...
      //如果Bucket池中不存在可复用的内存,则申请这段内存
      value = alloc(bucketedSize);
    }...
    ...
    return value;
  }
上一篇 下一篇

猜你喜欢

热点阅读