上篇文章中我们提到了图片加载其实是用了三条线程,如果没看过的同学可以先了解下这里。

fackbook的Fresco的Image Pipeline以及自身的缓存机制

那么今天我们就来探索一下如何在代码中改变图片实现的状态和内容,前面我们已经使用过SimpleDraweeView这个控件了,显示图片的时候直接写了一个setImageURI(uri),Fresco不仅仅提供了这一个方法来显示图片,它还提供了setController(controller)方法加载图片

DraweeController controller = Fresco.newDraweeControllerBuilder()
.setUri(uri)
.build();
imageView.setController(controller);

那有的人会问,如何加载监听?Controller?没错,就是它~

ControllerListener listener = new BaseControllerListener(){
@Override
public void onFinalImageSet(String id, Object imageInfo, Animatable animatable) {
super.onFinalImageSet(id, imageInfo, animatable);
}
@Override
public void onFailure(String id, Throwable throwable) {
super.onFailure(id, throwable);
}
@Override
public void onIntermediateImageFailed(String id, Throwable throwable) {
super.onIntermediateImageFailed(id, throwable);
}
};
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setUri(uri)
.setControllerListener(listener)
.build();
imageView.setController(controller);

建议使用

BaseControllerListener

图片加载成功或者失败,会执行里面的方法,其中图片加载成功时会执行onFinalImageSet方法,图片加载失败时会执行onFailure方法,如果图片设置渐进式,onIntermediateImageFailed会被回调

加载uri之后,如何实现在xml中的效果呢?

GenericDraweeHierarchy hierarchy = new GenericDraweeHierarchyBuilder(getResources())
.setFadeDuration(300)
.setBackground(getDrawable(R.drawable.ic_launcher))
.setPlaceholderImage(getDrawable(R.drawable.ic_launcher))
.setFailureImage(getDrawable(R.drawable.ic_launcher))
.build();
imageView.setHierarchy(hierarchy);

其实使用到的方法很多,你在xml中用到的都可以在这里设置,有些在xml中不能设置的在这里也是可以的。

例如,设置多张背景图片,设置多张叠加图,这里都可以实现,不过有一点必须注意,就是DraweeHiererchy创建时比较耗时,所以要多次利用。那如何使用会比较好?

GenericDraweeHierarchy hierarchyOLD = imageView.getHierarchy();

直接拿到对象--->hierarchyOLD

例如:它提供了渐进式加载图片,显示gif动画图片等等

首先是渐进式图片加载,这方面的功能充分考虑了网络比较慢的情况下,用户不至于一致在等,最起码能看到模糊的照片,这个所谓的渐进式加载就是说用户从图片加载之后,图片会从模糊到清晰的一个渐变过程,当然这个过程仅限于从网络加载图片,本地或者缓存等地方的图片也不需要渐进式加载,没有意义.

ProgressiveJpegConfig config = new ProgressiveJpegConfig() {
@Override
public int getNextScanNumberToDecode(int i) {
return 0;
}
@Override
public QualityInfo getQualityInfo(int i) {
return null;
}
};
ImagePipelineConfig imagePipelineConfig = ImagePipelineConfig.newBuilder(this)
.setProgressiveJpegConfig(config)
.build();
Fresco.initialize(getApplicationContext(),imagePipelineConfig);
ProgressiveJpegConfig config1= new SimpleProgressiveJpegConfig(list,2);//当然你也可以使用这个

FLog.setMinimumLoggingLevel(FLog.VERBOSE);
Set<RequestListener> listeners = new HashSet<>();
listeners.add(new RequestLoggingListener());
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this)
.setRequestListeners(listeners)
.build();
Fresco.initialize(this, config);
setContentView(R.layout.activity_main);
mProgressiveJpegView = (SimpleDraweeView) findViewById(R.id.my_image_view);
Uri uri = Uri.parse("http://pooyak.com/p/progjpeg/jpegload.cgi?o=1");
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
.setProgressiveRenderingEnabled(true)
.build();
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setImageRequest(request)
.build();
mProgressiveJpegView.setController(controller);

最后就是请求了 ~~

ImageRequest request = ImageRequestBuilder
.newBuilderWithSource(uri)
.setProgressiveRenderingEnabled(true)
.build();
PipelineDraweeController controller = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
.setImageRequest(request)
.setOldController(imageView.getController())
.build();
imageView.setController(controller);

那么,假设我们要下载一张比较大的图片,下载很慢的情况下有些服务器会提供一张缩略图,是服务器提供缩略图,服务器!!重要的事情要说三遍!!同样,Fresco也支持这种方法,记住,在controller中他们提供了两个不同的方法setLowResImageRequest和setImageRequest,顾名思义!

个人认为这个框架最巧妙的地方,就是把bitmap保存到ashmen,不会启动gc,使的界面不会因为gc而卡死。Fresco使用三级缓存,第一级缓存就是保存bitmap,第二级缓存保存在内存,但是没有解码,使用时需要界面,第三级缓存就是保存在本地文件,同样文件也未解码,使用的时候要先解码啦!

上面谈到的保存的很多内容都未解码,这也是fresco默认使用3个线程的原因,一个线程用来加载uri,一个线程用来解码,最后一个你知道它做什么,其余的内容后续会更新。

fresco还是挺强大的,个人觉得在某些地方还是有些不足的,不过底层实现也是挺有意思的,其实最后总结几点:

1.检查内存缓存,如有,返回

2.后台线程开始后续工作

3.检查是否在未解码内存缓存中。如有,解码,变换,返回,然后缓存到内存缓存中。

4.检查是否在文件缓存中,如果有,变换,返回。缓存到未解码缓存和内存缓存中。

5.从网络或者本地加载。加载完成后,解码,变换,返回。存到各个缓存中。


fackbook的Fresco的多种图片加载方法以及解码过程的更多相关文章

  1. touchweb手机网站图片加载方法(canvas加载和延迟加载)

    一.canvas图片加载 关于canvas加载,我的方法是,将文章中所有用到图片的地方,都用canvas代替,给canvas一个data-src,里面存放img的路径,通过canvas方法渲染图片.因 ...

  2. 【Android】安卓中常用的图片加载方法

    一.通过相机选图片: 布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout x ...

  3. 主流图片加载框架 ImageLoader、Glide、Picasso、Fresco 对比

    图片缓存库主页: Glidehttps://github.com/bumptech/glide fresco - An Android library for managing images and ...

  4. 图片加载框架之fresco

    FaceBook推出的图片处理框架主页: https://github.com/facebook/fresco中文文档:http://fresco-cn.org/docs/index.html 功能 ...

  5. Fresco-Facebook的图片加载框架的使用

    目前常用的开源图片加载框架有:1.Universal-Image-Loader,该项目存在于Github上面https://github.com/nostra13/Android-Universal- ...

  6. iOS图片加载框架-SDWebImage解读

    在iOS的图片加载框架中,SDWebImage可谓是占据大半壁江山.它支持从网络中下载且缓存图片,并设置图片到对应的UIImageView控件或者UIButton控件.在项目中使用SDWebImage ...

  7. iOS 图片加载框架- SDWebImage 解读

    在iOS的图片加载框架中,SDWebImage可谓是占据大半壁江山.它支持从网络中下载且缓存图片,并设置图片到对应的UIImageView控件或者UIButton控件.在项目中使用SDWebImage ...

  8. fackbook的Fresco (FaceBook推出的Android图片加载库-Fresco)

    [Android开发经验]FaceBook推出的Android图片加载库-Fresco   欢迎关注ndroid-tech-frontier开源项目,定期翻译国外Android优质的技术.开源库.软件 ...

  9. Android之图片加载框架Fresco基本使用(一)

    PS:Fresco这个框架出的有一阵子了,也是现在非常火的一款图片加载框架.听说内部实现的挺牛逼的,虽然自己还没研究原理.不过先学了一下基本的功能,感受了一下这个框架的强大之处.本篇只说一下在xml中 ...

随机推荐

  1. linux shell send and receive emails

    http://www.netcan666.com/2016/02/20/%E5%88%A9%E7%94%A8telnet%E5%9C%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E5% ...

  2. yaf性能测试(wamp环境)

    1实现mvc 出现helloword,成功 2.controller重定向 $get = $this->getRequest()->getQuery("get", &q ...

  3. 【C51】单片机独立按键与矩阵按键

    独立按键 首先既然是检测输入,对于当然要用到拉电阻,来检测引脚电平变化变化.51单片机中,除了P0口外,P2,P3,P4都是内置上拉电阻的准双向IO口,一般 的 51 P0引脚都外接了上拉电阻,当然也 ...

  4. 设计模式:职责链模式(Chain Of Responsibility)

    定  义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 结构图: 处理请求类: //抽象处理类 abs ...

  5. uzqp文件的加解密

    帮朋友做的,根据python版本翻译成的java版本,记录一下代码 import java.io.File; import java.io.FileInputStream; import java.i ...

  6. Magento white screen or how XML can break your site?

    Magento white screen or how XML can break your site? by SANDO on 02. OCT, 2012 in MAGENTO, SMALL TIP ...

  7. Android笔记:Socket客户端收发数据

    client.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" and ...

  8. cocoapods没有自动补齐

    在install cocoapods成功之后,输入头文件名的时候,没有提示,这样,我还以为是我的cocoapods安装出错了.原来是配置没有配置好. 解决办法: 选择工程的 Target -> ...

  9. zabbix监控activemq队列脚本

    公司业务使用activemq5.9.1消息队列,由于队列阻塞导致程序端口无响应,并且telnet无法连通.经过over 1 hour的排查,最终定位原因activemq导致.遂写了一个监控active ...

  10. 【转载】MFC 程序入口和执行流程

    原文链接: http://www.cnblogs.com/liuweilinlin/archive/2012/08/16/2643272.html 一 MFC程序执行过程剖析 1)我们知道在WIN32 ...