Android 面试题:列表下载图片线程管理

前段时间找工作面试遇到几个问题,在这分享一下

 

问题:在做一个列表时,每一行都有一张图片及其它信息,每页显示10条,当玩命滑动列表换页时,如何保证图片的异步下载及时显示屏幕内的图片

答案1:使用异步类,下载图片,每个异步都是并行的,所以屏幕内的图片就可以优先显示.

分析:这个答案,显然面试官是不满意的,因为假如每一个图片都直接开启异步线程下载,那这个线程数量是无法控制的,图片较多时,可能会有上百个线程在后台下载图片.

 

答案2:使用ExecutorService分配固定长度的线程池管理图片下载.比如线程数为5.

分析:问题又来了,ExecutorService 使用execute .submit方法提交给线程池的线程任务,当大于设定线程数时,ExecutorService 内部有一个队列,会自动排队等待.直接到按排队顺序逐个执行所有线程任务.显然,玩命滑动列表时,屏幕上的图片不一定能够优先显示.因为可能此时线程池在执行滑动之前的图片下载任务.

 

这两个答案都没有得到面试官的满意,有没有更好的方法呢,肯定是有,只是在面试的时候没有想到,而且之前的工作中也没有想到更好的办法处理.

 

经过自己事后仔细思考,答案终于还是找到了

最终答案1:

自已实现线程池类,具体描述如下:

1.可以设定线程池大小,比如线程数为5,即最多同时下载5张图片

2.实现execute方法来添加线程任务,同时根据队列任务数量,开辟线程,最多5个,

3.内部定义一个线程任务列表,线程池按按顺序获取线程任务,顺序执行

4.当一个线程执行完成后,判断线程任务列表是否有任务,没有,结束当前线程.

 

此方法具体实现可以参照:

http://blog.csdn.net/touch_2011/article/details/6914468 

这里基本实现了线程管理,只是这个实现当没有线程任务时,5个线程还会在后台默默的运行.所以修改成动态创建,释放线程的形式即可

 

当玩命滑动窗口时,我们就可以控制这个线程任务列表,可以移除任务列表,或者优先排队当前任务.这样就可以保证屏幕的图片优先显示.

 

最终答案2:

继续使用ExecutorService 类来管理线程,具体实现如下:

1.提前给线程池的Runnable对象中定义变量,isCancle表示是否取消执行,默认为false

2.在滑动列表时,滑动停步滑动后,当线程池内的Runnable对象isCancle设为true,即池中的任务列表全部取消,并且添加屏幕内的线程任务

你可能感兴趣的:(android)