Fresco中setFirstAvailableImageRequests其他意况美学原理

尝试一: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环境下的图纸UXC60L因为事先有缓存的,也只是直接使用缓存并不会进行实际网络下载的。经测试也知足了首长的须求,在性质上眼睛也未发现肯定的差距。

总结

尽管尝试2的法门完成了老板的急需,但是有个小风险的查询缓存的代码是在主线程中履行的,当上列表的时候有导致页面卡顿的只怕,但作者拿项目测试的时候从不发现这么,也就没留意。搜了下还有个主意查询,可是代码情势麻烦了些。还有形式一不行或许是自身姿势不对原因,有趣味的多多交换。

项目demo链接

Fresco是1个有力的图纸加载库,想必作者等码农都有使用过和询问,fresco官网。此前app端做过那样贰个优化依照用户手机的互联网环境加载对应的清晰度的图纸,一来是升迁用户体验加载快,二来节省用户的流量毕竟大家的国外用户流量很贵的。然后成效大家贯彻了,不一致网络环境请求例外的图形对应不相同的U奥迪Q5L。
–在此基础上领导提出个新须求,当在流量环境下一旦有Wi-Fi高清图片的缓存,就利用高清缓存的图形,不再去哀求低分辨率的图样。fresco的三级缓存策略的前提条件是唯一的UPRADOL分明某一张图片。而官员的渴求想当如U昂科雷L_a的请求使用U凯雷德L_b的缓存。