鸿 网 互 联 www.68idc.cn

胖虎谈ImageLoader框架(三)

来源:互联网 作者:佚名 时间:2015-11-26 06:24
--2007年第三季度正常客户星级select b.Corpid,b.corpname,b.Licenseno,b.Shopname,b.Principalname,nvl(a.clevel,XH)from mmregieinfoview b,(select clientid,

从学校出来的这半年时间,发现很少有时间可以静下来学习和写博文了,为了保持着学习和分享的习惯,我准备之后每周抽出一部分时间为大家带来一个优秀的Android框架源码阅读后的理解系列博文。

期许:希望可以和大家一起学习好此框架,也希望大家看博文前最好是先了解下框架的基本使用场景和使用方法,有什么问题可以留言给我,交流学习。
当然,再好的博文,也不如自己看一遍源码!

这周为大家带来的是《胖虎谈ImageLoader框架》系列,分析优秀的框架源码能让我们更迅速地提升,大家共勉!!
源码包下载地址:

希望我们尊重每个人的成果,转载请注明出处。
转载于:CSDN 胖虎 ,

正文

继上2篇博文《胖虎谈ImageLoader框架(一)》 《胖虎谈ImageLoader框架(二)》
带来这篇《胖虎谈ImageLoader框架(三)》,上篇我们提到的几个涉及到的类,希望读者可以自己去阅读源码理解,此篇博文不希望在解释源码,希望提到一些那些类中涉及到的知识(线程池,下载器实现,ReentrantLock和Synchronized,Collections.synchronizedMap等)

(ps:读此博文前,希望网友已经阅读并理解了《胖虎谈ImageLoader框架(一)》 《胖虎谈ImageLoader框架(二)》再阅读此博文。)

1、Java线程池
1.1 什么情况下我们才使用线程池?
答:需要做大量的请求,并且每个请求的时间很短。

1.2 使用线程池的好处?
答:减少频繁建立和销毁线程对象所需时间和内存消耗,提升了效率。

1.3 开始学习Java中的线程池
(1) JAVA中线程池的类和继承实现关系UML图

这里写图片描述

(2) ThreadPoolExecutor / ScheduledThreadPoolExecutor

2.1 ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

corePoolSize: 核心线程数量
maximumPoolSize: 线程池中最大可容纳数量
keepAliveTime: 线程在队列中等待被执行的超时时间
unit: 线程池允许超时时间的单位
workQueue: 线程池采用的缓冲队列
threadFactory:创建线程的工厂类
handler: 拒绝线程任务的处理类

线程池的运行机制:
1. 调用execute(Runnable)方法,添加一个线程任务到线程池中。
2. ▲线程池判断当前池中存在线程数 < corePoolSize, 立即创建一个新的线程,并执行该Runnable对象的run()方法。▲如果>=corePoolSize, 会将该任务添加到workQueue队列中,等待执行。▲如果workQueue队列中已经满了,并且线程池中的线程数还 < maximumPoolSize, 那么会创建一个新的线程来放入线程池中来处理此任务。▲如果如果workQueue队列中已经满了,并且线程池中的线程数>=maximumPoolSize , 那么会调用handler的策略方法拒绝掉该任务。

学习这个类,主要还是学习一下这个类的参数的意义和运行的机制,当然咱们也要顺带把这个类里面涉及到的周边类也学习一下。这里面提到了 ThreadFactory(可以自定义一个,用来修改线程的name, group, priority, daemon status等) , 队列(SynchronousQueue、LinkedBlockingQueue、ArrayBlockingQueue),拒绝任务的策略种类(1. AbortPolicy[直接抛RejectedExecutionException异常]、2.CallerRunsPolicy[再给一次尝试的机会]、3.DiscardPolicy[无作为]、4.DiscardOldestPolicy[舍弃队头任务,再尝试添加当前任务])

2.2 ScheduledThreadPoolExecutor
这个类继承于ThreadPoolExecutor,所以父类有的,它也一样,它的使用方式是 :
schedule(Runnable command, long delay, TimeUnit unit) , 可以设定一个延时执行的任务。

2、下载器实现
1. ImageLoader中实现了三种的下载器:BaseImageDownloader、NetworkDeniedImageDownloader、SlowNetworkImageDownloader(都实现了接口ImageDownloader)
2. ImageDownloader接口中,实现了Scheme类,用于判断传入的一个Uri是什么Schme和其他操作。
Scheme分为:HTTP(“http”), HTTPS(“https”), FILE(“file”), CONTENT(“content”), ASSETS(“assets”), DRAWABLE(“drawable”), UNKNOWN(“”)。
3.▲NetworkDeniedImageDownloader下载器,因为网络不能接触,所以就不处理”http”和”https” 这两种需要网络的Scheme。

private static class NetworkDeniedImageDownloader implements ImageDownloader { private final ImageDownloader wrappedDownloader; public NetworkDeniedImageDownloader(ImageDownloader wrappedDownloader) { this.wrappedDownloader = wrappedDownloader; } @Override public InputStream getStream(String imageUri, Object extra) throws IOException { switch (Scheme.ofUri(imageUri)) { case HTTP: case HTTPS: throw new IllegalStateException(); default: return wrappedDownloader.getStream(imageUri, extra); } } }

▲SlowNetworkImageDownloader下载器, 考虑到网络情况是属于比较差的,所以需要用到的InputStream来处理Scheme为”http”和”https”的Uri。

private static class SlowNetworkImageDownloader implements ImageDownloader { private final ImageDownloader wrappedDownloader; public SlowNetworkImageDownloader(ImageDownloader wrappedDownloader) { this.wrappedDownloader = wrappedDownloader; } @Override public InputStream getStream(String imageUri, Object extra) throws IOException { InputStream imageStream = wrappedDownloader.getStream(imageUri, extra); switch (Scheme.ofUri(imageUri)) { case HTTP: case HTTPS: return new FlushedInputStream(imageStream); default: return imageStream; } } }
网友评论
<