Fresco加载图片内存占用过大导致OOM

Fresco加载网络图片部分设备出现显示部分图片为黑色并崩溃

Fresco加载图片内存占用过大导致OOM_第1张图片

1.在使用Fresco显示网络图片在天猫魔盒M17设备时,出现部分图片显示为黑色,且一段时间后程序崩溃。

尝试把setImageURI方法替换为 public static void setBlurImage(SimpleDraweeView draweeView, String path) { ImageRequest request = ImageRequestBuilder. newBuilderWithSource(Uri.parse(path)) .setPostprocessor(new BlurPostprocessor(draweeView.getContext())) .build(); PipelineDraweeController controller = (PipelineDraweeController) Fresco .newDraweeControllerBuilder() .setImageRequest(request) .setOldController(draweeView.getController()) .build(); draweeView.setController(controller); } 后,原本正常显示的图片变得模糊,且还是部分图片显示黑色。

 

造成原因:不同设备给应用分配的内存大小不同,在使用Fresco加载大量图片的时候后容易造成内存溢出,使得占位图片被回收,显示为黑色

 

解决方案:SimpleDraweeView.setImageURI(url)方法改为

public static void showThumb(SimpleDraweeView draweeView, String url, int resizeWidthDp, int resizeHeightDp) {
        if (url == null || "".equals(url))
            return;
        if (draweeView == null)
            return;
        ImageRequest request = ImageRequestBuilder.newBuilderWithSource(Uri.parse(url))
                .setResizeOptions(new ResizeOptions(DensityUtils.dip2px(draweeView.getContext(), resizeWidthDp), DensityUtils.dip2px(draweeView.getContext(), resizeHeightDp)))
                .build();
        DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setImageRequest(request)
                .setOldController(draweeView.getController())
                .setControllerListener(new BaseControllerListener())
                .build();
        draweeView.setController(controller);
}

resizeWidthDp和resizeHeightDp的数值设置越小,所占用的内存越小,resizeWidthDp和resizeHeightDp数值与图片展示长宽无关,只与图片显示分辨率有关。例如设置100*100还是有问题的话可以调整至更小,数字随意如50 *50。

你可能感兴趣的:(Android)