首页 > 解决方案 > Fresco 高内存使用

问题描述

我们使用此处文档中提到的步骤设置了 Fresco - http://frescolib.org/docs/configure-image-pipeline.html

 ImagePipelineConfig config = ImagePipelineConfig
            .newBuilder(this)
            .setBitmapsConfig(Bitmap.Config.RGB_565)
            .setRequestListeners(requestListeners)
            .setDownsampleEnabled(true)
            .build();
    Fresco.initialize(this, config);

根据需要在应用程序 onCreate 中设置一次。来自网络的图像很少,无法匹配大小,因此我们必须使用 setDownsampleEnabled 和 resize 选项。

以下是用于加载图像的代码 -

ImageRequest request = ImageRequestBuilder.newBuilderWithSource(Uri.parse(asseturl))
            .setProgressiveRenderingEnabled(true)
            .setResizeOptions( new ResizeOptions(width,height))
            .build();
    DraweeController controller = Fresco.newDraweeControllerBuilder()
            .setImageRequest(request)
            .setOldController(sdv.getController())
            .setTapToRetryEnabled(true)
            .build();
    sdv.setController(controller);

控制器在 Recyclerview 的 onViewDetachedFromWindow 和 onViewRecycled 方法中设置为 null。

在运行应用程序的几分钟内,使用的内存非常高。

Profiler 内存图看起来并不漂亮。

Android Profiler 内存图

附上堆转储以供参考。

堆转储

还检查了 Fresco 的日志。该日志提到多次对同一图像进行下采样。我已经验证了对图像的请求只进行了一次。

附上 Logcat 快照

图像的 Fresco 日志快照

标签: androidmemoryfrescoandroid-profiler

解决方案


推荐阅读