Fresco是facebook自家出的一个强大的图片加载组件,因为缓存各方面强大的特性,所以在开发趣刻的时候,自己也将他加了进去
出现的第一个问题是用RecyclerView
实现瀑布流的时候,因为Fresco的SimpleDraweeView不能设置wrap_content,如果要使用则需设置setAspectRatio宽高比,所以除了获取网络加载图片的长宽之外,是比较难跟RecyclerView瀑布流结合的
第二个问题就是存储图片了,google了好久找不到答案,不过发现可以提取出缓存bitmap的方法,接着把bitmap存储就可以实现了,接下来贴代码:
ImageRequest imageRequest = ImageRequestBuilder .newBuilderWithSource(Uri.parse(url)) .setProgressiveRenderingEnabled(true) .build(); ImagePipeline imagePipeline = Fresco.getImagePipeline(); DataSource<CloseableReference<CloseableImage>> dataSource = imagePipeline.fetchDecodedImage(imageRequest, context); dataSource.subscribe(new BaseBitmapDataSubscriber() { @Override public void onNewResultImpl(Bitmap bitmap) { if (bitmap == null) { Toast.makeText(context, "保存图片失败啦,无法下载图片", Toast.LENGTH_SHORT).show(); } File appDir = new File(Environment.getExternalStorageDirectory(), "Coderfun"); if (!appDir.exists()) { appDir.mkdir(); } String fileName = desc + ".jpg"; File file = new File(appDir, fileName); try { FileOutputStream fos = new FileOutputStream(file); assert bitmap != null; bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); } catch (IOException e) { e.printStackTrace(); } uri = Uri.fromFile(file); // 通知图库更新 Intent scannerIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri); context.sendBroadcast(scannerIntent); } @Override public void onFailureImpl(DataSource dataSource) { } }, CallerThreadExecutor.getInstance());
支持
赞你!原创!