AsyncTask的新认识

我也是参考下面两篇颇有价值的文档,而后作一个总结的:android

http://blog.csdn.net/hitlion2008/article/details/7983449api

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方法,并传入本身定义的Executorgoogle

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根据本身要求第一个参数传入spa

new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory),这样的话能够本身控制并行最多几个线程运行,缓冲队列有多大,缓冲队列也满后能够作多开多少线程。.net

经过这么修改后发现图片加载很快,并且在老的android机器上测试也不会有何问题。线程

 

疑问:code

1.文章中说:executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)就跟2.3版本的AsyncTask.execute()效果是同样的

我感受仍是不太同样。

2.上面桔黄色部分,我看了source,感受仍是用了默认5个线程的THREAD_POOL_EXECUTOR而并非1个的newSingleThreadPool。

相关文章
相关标签/搜索