在之前的博客中,对AsyncTask做过详细分析,而且也以小案例的形式,介绍如何基本的使用它。今天再来探讨它,更多的认识,尤其在面试中以下面方式回答,可能印象分更多一些。

面试题:讲一讲您对AsyncTask的理解:

可以简单介绍之前文章的内容详解Android中AsyncTask的使用,再介绍一下下面的几点。

首先AsyncTask的几个基本方法:

protected void onPreExecute()
protected abstract Result doInBackground(Params... params)
protected void onPostExecute(Result result)
protected void onProgressUpdate(Progress... values)

AsyncTask源码分析

private static final int CORE_POOL_SIZE = 5;        //核心线程数
private static final int MAXIMUM_POOL_SIZE = 128; //最大线程数
private static final int KEEP_ALIVE = 1; //超时时间,当线程数超过核心线程数时,超过这个时间的空线程就会被销毁,直到线程数等于核心线程

AsyncTask缺陷

  • 1.同时只有5个线程去访问网络-->这个是重点
  • 2.线程数目超过128,会抛异常-->这个情况其实还好;

AsyncTask版本差异

  • COREPOOLSIZE
    MAXIMUM_POOLSIZE
    KEEPALIVE在不同的版本上.值是不一样;
  • 1.5前是串行执行的.每次执行1个任务
  • 1.6-2.3之前的版本.是并行执行的.每次执行5个任务
  • 3.0后提供串行和并行,默认情况是串行
  • 5.0后,最大核心数与核心线程数根据CPU来计算。
  • 串行、并行的修改代码如下:

    executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, null);//串行
    executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);//并行。我们想要并行执行,在启动AsyncTask的时候就要这样调用

AsyncTask简单封装

实际开发我们会去继承Asynctask

例如:

abstract class BaseTask extends AsyncTask<Void, Void, Void>{}

然后不同的任务,让孩子继承自BaseTask

那么接下来,打印log日志,理解一下版本差异问题。

安卓sdk不同的版本,线程池中维护的核心线程数目不一样。下面,下面以3.0-5.0之间版本做测试。

在活动中,创建如下的代码:

public class MainActivity extends BaseActivity {

	@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); findViewById(R.id.btn1).setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) { new MyTask().execute();
new MyTask().execute();
new MyTask().execute();
new MyTask().execute();
new MyTask().execute();
}
}); } class MyTask extends AsyncTask<Void, Void, Void> { @Override
protected Void doInBackground(Void... params) {
SystemClock.sleep(1000);
System.out.println("===doInBackground===");
return null;
} }
}

点击按钮,执行AsyncTask任务,如果在doInBackground中一次性输出5行日志(3.0-5.0之间核心线程数为5个),就说明此AsyncTask版本是并行执行的,如果隔1秒一行行的执行,则说明是串行的。

运行截图:

我们看日志,结果是一行行的执行,显然默认是串行执行。

但是,这样的话效率就显得低下,我们喜欢的并行执行。这时候手动改为并行。代码:

findViewById(R.id.btn1).setOnClickListener(new OnClickListener() {

			@Override
public void onClick(View v) {
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null); new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null); new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null); }
});

new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);改为了并行,这时候再运行,发现1秒打印5行日志(核心线程数为5)

喜欢我的朋友可以关注我哦~

也可以扫描下方的二维码,或搜索公众号  Android程序员开发指南  去微信每日阅读一篇安卓开发文章。

长按上方二维码,关注本公众号一起交流Android开发技术。

AsyncTask还要知道的一些知识的更多相关文章

  1. Jetty 服务器的知识

    Jetty 服务器的知识 也许你还没有听说过这个Jetty服务器,不过它确实是一种比较轻量级的Java服务器,和Tomcat一样,专门解释JavaWeb程序的服务器.因为在之前学习Java Web 的 ...

  2. Android学习笔记:多个AsyncTask实例的并发问题

    AsyncTask是Android给开发者提供的一个简单轻量级的多线程类,通过它我们可以很容易新建一个线程让在后台做一些耗时的操作(如IO操作.网络访问等),并在这个过程中更新UI.之所以说它轻量级, ...

  3. iOS动画中的物理知识应用之愤慨的小鸟-碰撞检測

    碰撞检測 源码:https://github.com/Esdeath/collsion 我相信搞iOS得人.多多少少都知道 弹球这个小游戏. 撞击不同的点,就能改变其运动的轨迹.对于非常多人来说,假设 ...

  4. 知识管理——得到CEO脱不花女士的一次分享

    知识管理--得到CEO脱不花女士的一次分享 近日,公司举办了一场"CKO首席知识官"研讨会,邀请到了得到APP的CEO脱不花女士做了一场精彩的分享,让我深受启发. 分享内容围绕3个 ...

  5. Android开发学习之路-机器学习库(图像识别)、百度翻译

    对于机器学习也不是了解的很深入,今天无意中在GitHub看到一个star的比较多的库,就用着试一试,效果也还行.比是可能比不上TensorFlow的,但是在Android上用起来比较简单,毕竟Tens ...

  6. 推荐--《Android深入浅出》

    基本信息 书名:Android深入浅出 作者:张旸 著 页数: 661 出版社: 机械工业出版社; 第1版 (2014年4月17日) 语种: 简体中文 ASIN: B00JR3P8X0 品牌: 北京华 ...

  7. MVC利用Routing实现多域名绑定一个站点、二级域名以及二级域名注册Area

    最近有这么个需求:在一个站点上绑定多个域名,每个域名进去后都要进入不同的页面.实现了这个功能以后,对于有多个域名,且有虚拟空间,但是虚拟空间却只匹配有一个站点的用户来说,可以节省很多小钱钱. 很久以前 ...

  8. 开班典礼-老师玩命的教,大家玩命的学,沉静,18K

    接下来的四个月决定我的命运,三年前决定现在,现在决定三年后.喜讯,双元安卓四期,1368$,到第二期仍然不成熟,打分意见多写, 孙健:15011386618 喊出你 的目标.自己监督不了自己,别人可能 ...

  9. 深入学习Android有关网络连接的内容

    基于实际项目中碰到的些许问题,开始重新深入学习Android网络连接有关知识. Android的4.1.2版本的AndroidHttpClient模块setSoTimeout之后实际超时时间和设置的时 ...

随机推荐

  1. 【SQL.基础构建-第一节(1/4)】

    --        Tips:数据库与sql--    一.What's 数据库-- 1.数据库(Database,DB):将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合.--   ...

  2. 玩一玩基于Token的 自定义身份认证+权限管理

    使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录.大概的流程是这样的: 客户端使用用户名跟密码请求登录 服务端收到请求,去验证用户名与密码 验证成功后,服务端会签发一个 Toke ...

  3. Java 嵌套类基础详解

    目录 1. 什么是嵌套类? 2. 为什么要使用嵌套类? 3. 嵌套类的类型 4. 静态嵌套类 5. 非静态嵌套类 5.1 成员内部类 5.2 局部内部类 5.3 匿名内部类 6. 嵌套接口 1. 什么 ...

  4. mybatis学习二

    Mybatis缓存1:缓存的概念    当用户频繁查询某些固定 的数据时,第一次将这些数据从数据库查询出来,保存在缓存中(内存,高速磁盘)中    当下次用户再次查询这些数据时,不用再通过数据库查询, ...

  5. My Answer in Regex Golf

    Warm Up Answer: foo Point(3) Anchors Answer: k$ Point(2) It never ends $ not allowed Answer: fu\b Po ...

  6. [HNOI2014]世界树

    题目描述 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里,公平是使世界树能够生生不息.持续运转的根本基 ...

  7. [HZOI 2015]疯狂的机器人

    [题目描述] 现在在二维平面内原点上有一只机器人 他每次操作可以选择向右走,向左走,向下走,向上走和不走(每次如果走只能走一格) 但是由于本蒟蒻施展的大魔法,机器人不能走到横坐标是负数或者纵坐标是负数 ...

  8. 亲戚(relative)

    [题目背景] Y 家是世界上最大的家族,HJZ 是其中一员. 现在 Y 家人想要拍一张全家福,却发现这是一个十分复杂的问题. . . . . . [题目描述] Y 家一共有 n 人 其中每个人最多有一 ...

  9. 【BZOJ1483】【HNOI2009】梦幻布丁

    题意:n个连续的点,有若干种颜色,每个颜色会因为某些操作变为另一种颜色,动态查询颜色段数. 解题思路:对每个颜色开一棵平衡树启发式合并应该是最裸的想法,但是我们有更优的! 考虑对每个颜色利用链表储存它 ...

  10. 【NOIP2016】愤怒的小鸟

    题目描述 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形 ...