Fresco中setFirstAvailableImageRequests其他情形

Fresco是一个有力的图片加载库,想必我等码农都产生以了与了解,fresco官网。之前app端做了如此一个优化根据用户手机的网环境加载对应之清晰度之图形,一来是提升用户体验加载快,二来节省用户之流量总我们的国外用户流量异常高昂的。然后功能我们兑现了,不同网络环境要例外之图样对诺不同之URL。
–以这基础及领导提出个新需要,当在流量环境下而来Wi-Fi高清图片的缓存,就利用高清缓存的图,不再去请低分辨率的图形。fresco的老三层缓存策略的前提条件是绝无仅有的URL确定有平等张图。而主管之渴求想当如URL_a的伸手使用URL_b的缓存。

尝试一:setFirstAvailableImageRequests 方式。

翻看fresco文档发现发【多图要和图片复用】介绍,里面的【加载最先可用的图】小段讲的枝叶例是图表上传,本地图片和网下充斥图片以该方式,我们的现象是似乎可以吗适用。

      Uri uri1, uri2;
      ImageRequest request1 = ImageRequest.fromUri(uri1);
      ImageRequest request2 = ImageRequest.fromUri(uri2);
      ImageRequest[] requests = { request1, request2 };

     DraweeController controller = Fresco.newDraweeControllerBuilder()
    .setFirstAvailableImageRequests(requests)
    .setOldController(mSimpleDraweeView.getController())
    .build();
    mSimpleDraweeView.setController(controller);

可事实本身断点测试的结果却非文档所称,有小概率会会达到梦想洗了。可多时候是预先使request1请求的图样,及时是发request2的苏存图片,request1需要网络要下充斥图片的。

品尝二:代码中判断是否在Wi-Fi高清图片缓存。
      if (NetWorkHelper.netWorkState != NetWorkHelper.kNetWorkWIFI && PreferenceUtil.getBool(App.getInstance(), PreferenceUtil.BOOL_NETWORK_GETING_IMAGE, false)) {
                        //非Wi-Fi环境下,原则上选择当前网络环境的压缩图片。但当存在Wi-Fi环境下的高清图缓存时候,使用Wi-Fi高清图。无则重新下载
                        boolean isCacheInDisk = Fresco.getImagePipelineFactory().getMainBufferedDiskCache
                                ().containsSync(new SimpleCacheKey(url));
                        boolean isCacheInFile = Fresco.getImagePipelineFactory().getMainFileCache()
                                .hasKey(new SimpleCacheKey(url));
                        ImageRequest request;
                        if (isCacheInDisk || isCacheInFile) {
                            request = ImageRequest.fromUri(uri);
                        } else {
                            request = ImageRequest.fromUri(Uri.parse(formatUrl(uri.toString(), getWidth(), getHeight())));
                        }
                        DraweeController controller = Fresco.newDraweeControllerBuilder()
                                .setImageRequest(request)
                                .setCallerContext(callerContext)
                                .setOldController(getController())
                                .build();
                        setController(controller);
                    } else {
                        //Wi-Fi环境下选择高清大图
                        ImageRequest request2 = ImageRequest.fromUri(uri);
                        DraweeController controller = Fresco.newDraweeControllerBuilder()
                                .setImageRequest(request2)
                                .setCallerContext(callerContext)
                                .setOldController(getController())
                                .build();
                        setController(controller);
                    }

代码逻辑就是是判缓存中是不是是,存在即请求Wi-Fi环境下之图纸url,不设有即请流量环境下的图url.至于判断两不行缓存是自fresco的老三层缓存原理,一个是外存中的休养生息存一个凡是磁盘缓存。同样这里失去请Wi-Fi环境下之图URL因为事先有缓存的,也仅仅是直接使用缓存并无见面开展实际网络下载的。经测试为满足了主任的要求,在性质达到眼也非发现肯定的别。

总结

尽管尝试2的章程实现了主任之需求,但是有只稍风险的查询缓存的代码是当主线程遭遇施行之,当及列表的时节发生导致页面卡顿的或许,但自身用项目测试的当儿从不察觉这样,也即不曾留神。搜了生还来只措施查询,不过代码方式麻烦了几。还有方式同样不行也许是本身姿势不对准因,有趣味的多交流。

项目demo链接