我也是参考下面两篇很有价值的文档,然后做一个总结的:

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。

AsyncTask的新认识的更多相关文章

  1. Androidannotations框架

    Java注解:    注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段.方法.局部变量. ...

  2. Android Annotations浅析

    这阵子遇到了好多事情,挺久没来更新博文了,这两天在学这个开源框架Android Annotations,用起来感觉挺方便的, 相信用过Spring注解的孩子理解起来应该比較easy! 就是配置起来比較 ...

  3. Android 旋转屏幕--处理Activity与AsyncTask的最佳解决方案

    一.概述 运行时变更就是设备在运行时发生变化(例如屏幕旋转.键盘可用性及语言).发生这些变化,Android会重启Activity,这时就需要保存activity的状态及与activity相关的任务, ...

  4. Android必学——AsyncTask

    第一章  AsyncTask的基本构成 为是么要异步任务 1)Android单线程模型 2)耗时操作放在非主线程中执行 AsyncTask为何而生 1)子线程中跟新UI 2)封装.简化异步操作 pub ...

  5. [Android Pro] AsyncTaskLoader vs AsyncTask

    reference to : http://blog.csdn.net/a910626/article/details/45599133 我看了一下asyncTask是从LV3开始,AsyncTask ...

  6. Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

    前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...

  7. 小白挑战:AsyncTask源码分析

    //AsyncTask从本质上讲,是对ThreadPool和handler的封装. 在学习线程池相关的知识时,看到书中提到AsyncTask的实现中使用到了ThreadPool,于是把源码翻了出来, ...

  8. Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案

    的最佳方案 标签: Android屏幕旋转AsyncTaskProgressDialog 2014-07-19 09:25 39227人阅读 评论(46) 收藏 举报 分类: [android 进阶之 ...

  9. 详解AsyncTask的使用

    转载自:http://blog.csdn.net/liuhe688/article/details/6532519 在Android中实现异步任务机制有两种方式,Handler和AsyncTask. ...

随机推荐

  1. Binary Tree Maximum Path Sum [leetcode] dp

    a(i):在节点i由于单边路径的最大结束 b(i):在节点i路径和 a(i) = max{ i->val, i->val + max{a(i->left), a(i->righ ...

  2. NYNU_省赛选拔题(3)

    题目描述 二叉树,若其与自己的镜像完全相同,就称其为镜像树. 是一棵镜像树:而 不是镜像树.现给你一棵二叉树,请你判断其是不是镜像树. 输入 第一行是一个整数数T,表示测试数据有多少组每组数据第一行是 ...

  3. CQRS模式实现

    [.NET领域驱动设计实战系列]专题十:DDD扩展内容:全面剖析CQRS模式实现 一.引言 前面介绍的所有专题都是基于经典的领域驱动实现的,然而,领域驱动除了经典的实现外,还可以基于CQRS模式来进行 ...

  4. MvcOptions配置

    MvcOptions配置 程序模型处理 IApplicationModelConvention 在MvcOptions的实例对象上,有一个ApplicationModelConventions属性(类 ...

  5. .Net常用方法汇总

    //创建某个目录的文件夹 调用如下: var folder = initFolder(Export_Folder.Text, "ExportMembers"); private s ...

  6. C#操作Xml:XSLT语法 在.net中使用XSLT转换xml文档示例

    XSL即可扩展的样式表文件. 可以格式化xml的显示,也可以将xml转换成需要的另一种格式. 学习XSL必须熟悉XPath.XSL和XPath一样简单强大,容易学习. 1. XSL既然可以格式化xml ...

  7. java_eclipse_svn 与服务器同步时 ,忽略某类型文件和文件夹

    1. 在项目开发中使用svn ,带来很大的方便,有时我们会把整个项目上传的svn服务器上 这样就包含了  编译过的class文件  以及 一些 .svn,.log文件,有些文件时本地complie 的 ...

  8. Android 平台 HTTP网速測试 案例 API 分析

    作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/25996817 工信部规定的网速測试标准 : 除普通网页測速 ...

  9. cocos2d-x 颜色

    ccBlendFunc cbl = {GL_SRC_ALPHA, GL_ONE}; Sprite *sprite = Sprite::create("128_00002.png") ...

  10. Windows系统下Redis的安装

    Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Github.StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http://redis.io/. 最近 ...