我也是参考下面两篇很有价值的文档,然后做一个总结的:
http://blog.csdn.net/hitlion2008/article/details/7983449
http://blog.csdn.net/mylzc/article/details/6784415
最近主管让我看一下某个性能方面的问题,场景类似于一个weibo页,外层weibo列表加载很多图片并不是很卡,但是进入单个weibo,评论列表里面滑动有时就会卡顿。缓存方面原本已经做好,那究竟是为什么呢?
想到的主要原因:列表页同一时间相对图片需要下载的并不是很多,评论页的话都是小图片,屏幕里可见区域里需要下载的图片较多,所以会卡顿。
找了一个下午,发现了上面这两篇文章,在API10(包括10)之后AsycnTask的实现有了大变化。10之前默认是最多5个线程运行,超过5个的就要等待。google在之后意识到了这个问题,增加了一个executeOnExecutor的方法,可以自定义线程池来运行和调度Thread。原来的execute方法到了api10之后默认就是按提交的次序,每次只启动一个线程执行一个任务,完成之后再执行第二个任务,也就是相当于只有一个后台线程在执行所提交的任务(Executors.newSingleThreadPool())。然后改为根据api版本号来分别调用前者或者executeOnExecuteor方法,并传入自己定义的Executor
private static final int CORE_POOL_SIZE = 5; private static final int MAXIMUM_POOL_SIZE = 128; private static final int KEEP_ALIVE = 1; private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(10); /** * An {@link Executor} that can be used to execute tasks in parallel. */ public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
可以在executeOnExecuteor根据自己要求第一个参数传入
new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory),这样的话可以自己控制并行最多几个线程运行,缓冲队列有多大,缓冲队列也满后可以做多开多少线程。
通过这么修改后发现图片加载很快,而且在老的android机器上测试也不会有何问题。
疑问:
1.文章中说:executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)就跟2.3版本的AsyncTask.execute()效果是一样的
我感觉还是不太一样。
2.上面桔黄色部分,我看了source,感觉还是用了默认5个线程的THREAD_POOL_EXECUTOR而并不是1个的newSingleThreadPool。