android fresco 存储,Android使用Fresco之下载图片(包括GIF图)
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图)相关推荐
- android+nutz后台如何上传和下载图片
android+nutz后台如何上传和下载图片 发布于 588天前 作者 yummy222 428 次浏览 复制 上一个帖子 下一个帖子 标签: 无 最近在做一个基于android的app ...
- android实现存储,Android开发实现文件存储功能
本文实例为大家分享了Android开发实现文件存储的具体代码,供大家参考,具体内容如下 这个程序只有一个Activity, Activity中只有一个Edittext.实现的功能是在Activity销 ...
- android+默认存储,Android 数据存储之SP存储,内部存储,外部存储
Android 数据存储之SP存储,内部存储,外部存储 Android提供了多种数据存储的技术来永久的保存应用数据,以便于开发者能够根据自己的需求来选择合适的数据存储方案,主要有SharedPrefe ...
- android 数据存储----android短信发送器之文件的读写(手机+SD卡)
本文实践知识点有有三: 1.布局文件,android布局有相对布局,线性布局,绝对布局,表格布局,标签布局等.各个布局能够嵌套的.本文的布局文件就是线性布局的嵌套 <LinearLayout x ...
- android纹理存储,android纹理文本
这是使用PorterDuffXfermode进行此操作的一种方法. public class MainActivity extends Activity { private EditText mEdi ...
- 下列哪个可做 Android 数据存储,Android应用开发试题
Android应用开发试题 一.选择题(每题2分,共30分) 1. 下列不是手机操作系统的是?()D A. Android B. Window Mobile C. Apple IPhone IOS D ...
- Android购物车存储,Android app购物车功能实现
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? UI效果图如下: 实现购物车功能的要点:购物车UI的布局 购物车里面商品数量是保存在本地数据库sqlite,要保证UI上 ...
- mac连接android手机存储,Android安卓设备连接Mac的方法
平时大家用到最多的就是安卓手机和苹果电脑互连,由于安卓系统应用广泛,很多平板电脑还有电视都在用安卓的系统,下面是我们整理的安卓连接MAC电脑的方法. 一.使用第三方的链接软件 现在很多第三方的应用软件 ...
- android下载图片 服务器,Android网络客户端从服务器电脑上下载图片
前言,bitmap位图,后缀名.bmp/.dip,图片的一种编码格式,一张图片由多个像素组成,每个像素可以表达多种色彩.bitmap是inputStream.drawable.byte[].outpu ...
- android纹理存储,Android:OpenGL存储纹理多长时间?
openGL存储纹理多长时间? 离开活动时纹理内存是否会被回收? 例如,如果我有以下代码: mGL.glGenTextures(1, mTextures, 0); mGL.glBindTexture( ...
最新文章
- 参加第十六届智能车竞赛同学提问与回答-6-30
- 小白也能看懂——使用dev-c++建立工程(多个文件一同编译连接)并运行
- c#Md5 32位加密结果少了两个0的原因
- MySQL:错误代码1215 无法添加外键约束的解决思路
- 软考信息安全工程师备考笔记8:第八章应用系统安全工程备考要点
- android 软件测试文档,Android软件测试文档规范【参考】.doc
- unable to bind to locking port 7054 within 45000 ms
- 最简单的基于FFmpeg的移动端例子:IOS 视频解码器
- 2.1 全连接神经网络
- 如何用CSC.exe来编译Visual C#的代码文件
- 视频转gif怎样操作?如何快速在线生成gif动图?
- pp助手苹果版_吃药提醒助手ios版下载-吃药提醒助手苹果版下载v1.0
- 数据统计分析(SPSS)【8】
- MathType注册表位置
- 什么是云计算,云计算是什么意思
- 鸿蒙系统小白,站在小白用户的立场上看待华为的鸿蒙系统
- ETIMEDOU 104.16.20.35:443(已解决)
- 第1章 KRKR游戏系统汉化说明
- 眉骨高者为大贵之相_眉骨高者为大贵之相 能成大器
- 批次级别和批次库存的后台字段