• fackbook的Fresco的Image Pipeline以及自身的缓存机制


    fackbook的Fresco的Image Pipeline以及自身的缓存机制

    配置之前、首先需要知道两点:一点是Bitmap缓存、一点是如果你仅仅需要一个缓存,那么不调用setSmallImageDiskCacheConfig即可。Image pipeline 默认会使用同一个缓存,同时ImageType也会被忽略。


    配置Image Pipeline

    对于大多数的应用,Fresco的初始化,只需要以下一句代码:

    Fresco.initialize(context);

    对于那些需要更多进一步配置的应用,我们提供了ImagePipelineConfig

    以下是一个示例配置,列出了所有可配置的选项。几乎没有应用是需要以下这所有的配置的,列出来仅仅是为了作为参考。

    ImagePipelineConfig config = ImagePipelineConfig.newBuilder()
        .setBitmapMemoryCacheParamsSupplier(bitmapCacheParamsSupplier)
        .setCacheKeyFactory(cacheKeyFactory)
        .setEncodedMemoryCacheParamsSupplier(encodedCacheParamsSupplier)
        .setExecutorSupplier(executorSupplier)
        .setImageCacheStatsTracker(imageCacheStatsTracker)
        .setMainDiskCacheConfig(mainDiskCacheConfig)
        .setMemoryTrimmableRegistry(memoryTrimmableRegistry) 
        .setNetworkFetchProducer(networkFetchProducer)
        .setPoolFactory(poolFactory)
        .setProgressiveJpegConfig(progressiveJpegConfig)
        .setRequestListeners(requestListeners)
        .setSmallImageDiskCacheConfig(smallImageDiskCacheConfig)
        .build();
    Fresco.initialize(context, config);

    请记得将配置好的ImagePipelineConfig 传递给 Fresco.initialize! 否则仍旧是默认配置。

    关于Supplier

    许多配置的Builder都接受一个Supplier 类型的参数而不是一个配置的实例。

    创建时也许有一些麻烦,但这带来更多的利好:这允许在运行时改变创建行为。以内存缓存为例,每隔5分钟就可检查一下Supplier,根据实际情况返回不同类型。

    如果你需要动态改变参数,那就是用Supplier每次都返回同一个对象。

    Supplier<X> xSupplier = new Supplier<X>() {
      public X get() {
        return new X(xparam1, xparam2...);
      }
    );
    // when creating image pipeline
    .setXSupplier(xSupplier);

    线程池

    Image pipeline 默认有3个线程池:(重要的事情要说三遍、三个线程池、三个线程池、是真的三个线程池)

    1. 3个线程用于网络下载
    2. 两个线程用于磁盘操作: 本地文件的读取,磁盘缓存操作。
    3. 两个线程用于CPU相关的操作: 解码,转换,以及后处理等后台操作。

    对于网络下载,你可以定制网络层的操作,具体参考:自定义网络层加载.

    对于其他操作,如果要改变他们的行为,传入一个ExecutorSupplier即可。

    内存缓存的配置

    内存缓存和未解码的内存缓存的配置由一个Supplier控制,这个Supplier返回一个[MemoryCacheParams](../javadoc/reference/com/facebook/imagepipeline/cache/MemoryCacheParams.html#MemoryCacheParams(int, int, int, int, int)) 对象用于内存状态控制。

    配置磁盘缓存

    你可使用Builder模式创建一个 DiskCacheConfig:

    DiskCacheConfig diskCacheConfig = DiskCacheConfig.newBuilder()
       .set....
       .set....
       .build()
    
    // when building ImagePipelineConfig
    .setMainDiskCacheConfig(diskCacheConfig)

    缓存统计

    如果你想统计缓存的命中率,你可以实现ImageCacheStatsTracker, 在这个类中,每个缓存时间都有回调通知,基于这些事件,可以实现缓存的计数和统计。


    缓存

    三级缓存

    1. Bitmap缓存

    Bitmap缓存存储Bitmap对象,这些Bitmap对象可以立刻用来显示或者用于后处理

    在5.0以下系统,Bitmap缓存位于ashmem,这样Bitmap对象的创建和释放将不会引发GC,更少的GC会使你的APP运行得更加流畅。

    5.0及其以上系统,相比之下,内存管理有了很大改进,所以Bitmap缓存直接位于Java的heap上。

    当应用在后台运行是,该内存会被清空。

    2. 未解码图片的内存缓存

    这个缓存存储的是原始压缩格式的图片。从该缓存取到的图片在使用之前,需要先进行解码。

    如果有调整大小,旋转,或者WebP编码转换工作需要完成,这些工作会在解码之前进行。

    APP在后台时,这个缓存同样会被清空。其实有一点很重要、你无需关心是否已经解码

    3. 文件缓存

    和未解码的内存缓存相似,文件缓存存储的是未解码的原始压缩格式的图片,在使用之前同样需要经过解码等处理。

    和内存缓存不一样,APP在后台时,内容是不会被清空的。即使关机也不会。用户可以随时用系统的设置菜单中进行清空缓存操作。



    用一个文件还是两个文件缓存?

    如果要使用2个缓存,在配置image pipeline 时调用 setMainDiskCacheConfig 和 setSmallImageDiskCacheConfig 方法即可。

    大部分的应用有一个文件缓存就够了,但是在一些情况下,你可能需要两个缓存。比如你也许想把小文件放在一个缓存中,大文件放在另外一个文件中,这样小文件就不会因大文件的频繁变动而被从缓存中移除。

    至于什么是小文件,这个由应用来区分,在创建image request, 设置 ImageType 即可:

    java
    ImageRequest request = ImageRequest.newBuilderWithSourceUri(uri)
        .setImageType(ImageType.SMALL)

    如果你仅仅需要一个缓存,那么不调用setSmallImageDiskCacheConfig即可。Image pipeline 默认会使用同一个缓存,同时ImageType也会被忽略。

    内存用量的缩减

    在 配置Image pipeline 时,我们可以指定每个缓存最大的内存用量。但是有时我们可能会想缩小内存用量。比如应用中有其他数据需要占用内存,不得不把图片缓存清除或者减小 或者我们想检查看看手机是否已经内存不够了。

    Fresco的缓存实现了DiskTrimmable 或者 MemoryTrimmable 接口。这两个接口负责从各自的缓存中移除内容。

    在应用中,可以给Image pipeline配置上实现了DiskTrimmableRegistry 和 MemoryTrimmableRegistry 接口的对象。

    实现了这两个接口的对象保持着一个列表,列表中的各个元素在内存不够时,缩减各自的内存用量。


    转载请注明转载地址:http://blog.csdn.net/djy1992/article/details/48291681


  • 相关阅读:
    VMDNAMD命令规则(转载)
    VMD的相关命令(转载)
    Clayff力场(转载)
    如何处理遇到的错误-lammps
    数据分析及结果
    了解vue里的Runtime Only和Runtime+Compiler
    实例的属性和方法
    组件通信精髓
    vue内置的标签(组件)
    class和style属性
  • 原文地址:https://www.cnblogs.com/new0801/p/6175801.html
Copyright © 2020-2023  润新知