Fresco相信大家都不陌生,是个很不错的图片加载器

最近做的需求有查看大图保存图片,保存图片很简单,但是保存gif图就需要处理一下了。

之前google了好久,也没有找到靠谱的答案,(还是API看的不够仔细 ~)

原理在Fresco 数据源和数据订阅者

因为是查看大图的时候保存图片,所以其实没有必要非从网络去下载图片了,内存or磁盘中可能已经有缓存,再去网络下载,显然是浪费用户的流量,所以我是这样做的。。。

情况一:

如果你的应用只有静态图片,那么

DataSource> dataSource1 = imagePipeline.fetchDecodedImage(imageRequest, null);dataSource1.subscribe(new BaseBitmapDataSubscriber() { @Override protected void onNewResultImpl(Bitmap bitmap) { //get bitmap } @Override protected void onFailureImpl(DataSource> dataSource) { }}, CallerThreadExecutor.getInstance());

情况二:

如果你的应用有静态图片也有动态图片(GIF)

DataSource> dataSource =

imagePipeline.fetchEncodedImage(imageRequest, null);

dataSource.subscribe(newBaseDataSubscriber>() {

@Override

protected voidonNewResultImpl(DataSource> dataSource) {

if(!dataSource.isFinished()) {

saveFail();

return;

}

CloseableReference ref = dataSource.getResult();

if(ref !=null) {

try{

PooledByteBuffer result = ref.get();

InputStream is =newPooledByteBufferInputStream(result);

try{

ByteArrayOutputStream bos =newByteArrayOutputStream(1000);

byte[] b =new byte[1000];

intn;

while((n = is.read(b)) != -1) {

bos.write(b,0,n);

}

is.close();

bos.close();

savePic(url,bos.toByteArray());//通过byte文件头,判断是否是gif,再做相应的命名处理

}catch(Exception e) {

}finally{

Closeables.closeQuietly(is);

}

}finally{

CloseableReference.closeSafely(ref);

ref =null;

}

}

}

@Override

protected voidonFailureImpl(DataSource> dataSource) {

saveFail();

}

},CallerThreadExecutor.getInstance());

总结

现在开源项目特别多,大家也都尽可能的不去重复造轮子,但是使用一个好的开源框架,最好还是了解一下源码的实现,这样在使用的过程中,遇到的任何问题,都有解释的依据。

情况一中,对图片做了解码处理,如果不想要解码,直接使用情况二的方式也是可以的。

null是什么鬼

上图中的null是什么鬼

其实是需要传递的是context但是我们看源码

simpleDraweeView.setImageURI(getImageUri(path)

发现我们在调用设置图片是,底层传递的就是null,所以为了避免我们的context被无法控制的第三方框架一直引用而引发内存泄露,我们这里还是不要把context传递过去了(毕竟不传,也没发现什么问题),至于为什么会有这个参数,还是要多看源码分析了。

保存到系统相册的问题

前面的保存,我们是保存到sd卡中我们自己的目录,但是如果要保存到系统相册,大部分使用的方式:

File file =newFile(filePath);

String uri =null;

String systemFilepath = filePath;

try{

uri = MediaStore.Images.Media.insertImage(context.getContentResolver(),file.getAbsolutePath(),"","");

systemFilepath =getFilePathByContentResolver(context,Uri.parse(uri));

MediaScannerConnection.scanFile(context, newString[]{systemFilepath}, null, null);

FileHelper.DataDir.deleteFileOrDir(file);

returnsystemFilepath;

}catch(Throwable e) {

}

这里有个问题,看源码

insertImage

系统默认存储的是jpeg格式,这样如果保存GIF图就悲剧了。。。

开始我是想,拿到系统相册路径,手动保存,但是有两个问题

1、系统相册路径如何获取(不同rom存储的位置都不一样)

2、自己保存,缩略图怎么生成(系统保存到相册的的insertImage默认会保存一份缩略图)

目前这块我还没找到更好的方式处理,找到后一定要记录下来。。。

好了,我去写代码了。。。

android fresco 存储,Android使用Fresco之下载图片(包括GIF图)相关推荐

  1. android+nutz后台如何上传和下载图片

    android+nutz后台如何上传和下载图片 发布于 588天前  作者 yummy222  428 次浏览  复制  上一个帖子  下一个帖子  标签: 无 最近在做一个基于android的app ...

  2. android实现存储,Android开发实现文件存储功能

    本文实例为大家分享了Android开发实现文件存储的具体代码,供大家参考,具体内容如下 这个程序只有一个Activity, Activity中只有一个Edittext.实现的功能是在Activity销 ...

  3. android+默认存储,Android 数据存储之SP存储,内部存储,外部存储

    Android 数据存储之SP存储,内部存储,外部存储 Android提供了多种数据存储的技术来永久的保存应用数据,以便于开发者能够根据自己的需求来选择合适的数据存储方案,主要有SharedPrefe ...

  4. android 数据存储----android短信发送器之文件的读写(手机+SD卡)

    本文实践知识点有有三: 1.布局文件,android布局有相对布局,线性布局,绝对布局,表格布局,标签布局等.各个布局能够嵌套的.本文的布局文件就是线性布局的嵌套 <LinearLayout x ...

  5. android纹理存储,android纹理文本

    这是使用PorterDuffXfermode进行此操作的一种方法. public class MainActivity extends Activity { private EditText mEdi ...

  6. 下列哪个可做 Android 数据存储,Android应用开发试题

    Android应用开发试题 一.选择题(每题2分,共30分) 1. 下列不是手机操作系统的是?()D A. Android B. Window Mobile C. Apple IPhone IOS D ...

  7. Android购物车存储,Android app购物车功能实现

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? UI效果图如下: 实现购物车功能的要点:购物车UI的布局 购物车里面商品数量是保存在本地数据库sqlite,要保证UI上 ...

  8. mac连接android手机存储,Android安卓设备连接Mac的方法

    平时大家用到最多的就是安卓手机和苹果电脑互连,由于安卓系统应用广泛,很多平板电脑还有电视都在用安卓的系统,下面是我们整理的安卓连接MAC电脑的方法. 一.使用第三方的链接软件 现在很多第三方的应用软件 ...

  9. android下载图片 服务器,Android网络客户端从服务器电脑上下载图片

    前言,bitmap位图,后缀名.bmp/.dip,图片的一种编码格式,一张图片由多个像素组成,每个像素可以表达多种色彩.bitmap是inputStream.drawable.byte[].outpu ...

  10. android纹理存储,Android:OpenGL存储纹理多长时间?

    openGL存储纹理多长时间? 离开活动时纹理内存是否会被回收? 例如,如果我有以下代码: mGL.glGenTextures(1, mTextures, 0); mGL.glBindTexture( ...

最新文章

  1. 参加第十六届智能车竞赛同学提问与回答-6-30
  2. 小白也能看懂——使用dev-c++建立工程(多个文件一同编译连接)并运行
  3. c#Md5 32位加密结果少了两个0的原因
  4. MySQL:错误代码1215 无法添加外键约束的解决思路
  5. 软考信息安全工程师备考笔记8:第八章应用系统安全工程备考要点
  6. android 软件测试文档,Android软件测试文档规范【参考】.doc
  7. unable to bind to locking port 7054 within 45000 ms
  8. 最简单的基于FFmpeg的移动端例子:IOS 视频解码器
  9. 2.1 全连接神经网络
  10. 如何用CSC.exe来编译Visual C#的代码文件
  11. 视频转gif怎样操作?如何快速在线生成gif动图?
  12. pp助手苹果版_吃药提醒助手ios版下载-吃药提醒助手苹果版下载v1.0
  13. 数据统计分析(SPSS)【8】
  14. MathType注册表位置
  15. 什么是云计算,云计算是什么意思
  16. 鸿蒙系统小白,站在小白用户的立场上看待华为的鸿蒙系统
  17. ETIMEDOU 104.16.20.35:443(已解决)
  18. 第1章 KRKR游戏系统汉化说明
  19. 眉骨高者为大贵之相_眉骨高者为大贵之相 能成大器
  20. 批次级别和批次库存的后台字段

热门文章

  1. Flyweight模式
  2. hive数据导入导出和常用操作
  3. hdu 5437Alisha’s Party(优先队列)
  4. maven 部署及使用
  5. linux ssh 双机互信
  6. php 日期和时间 (转)
  7. 【车道线检测与寻迹】2月24日 CVST工具箱模块仿真与图像处理(二)、基于Vision对象的边缘检测、余弦变换压缩,与峰值信噪比
  8. Mysql优化(出自官方文档) - 第八篇(索引优化系列)
  9. 「腾讯地图」小程序插件
  10. [每日更新-MySQL基础]-1.认识MySQL