zoukankan      html  css  js  c++  java
  • 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


  • 相关阅读:
    多表联合查询,利用 concat 模糊搜索
    order by 中利用 case when 排序
    Quartz.NET 3.0.7 + MySql 动态调度作业+动态切换版本+多作业引用同一程序集不同版本+持久化+集群(一)
    ASP.NET Core 2.2 基础知识(十八) 托管和部署 概述
    ASP.NET Core 2.2 基础知识(十七) SignalR 一个极其简陋的聊天室
    ASP.NET Core 2.2 基础知识(十六) SignalR 概述
    ASP.NET Core 2.2 基础知识(十五) Swagger
    ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)
    linux磁盘管理 磁盘查看操作
    linux磁盘管理 文件挂载
  • 原文地址:https://www.cnblogs.com/new0801/p/6175801.html
Copyright © 2011-2022 走看看