AsyncTask还要知道的一些知识
在之前的博客中,对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还要知道的一些知识的更多相关文章
- Jetty 服务器的知识
Jetty 服务器的知识 也许你还没有听说过这个Jetty服务器,不过它确实是一种比较轻量级的Java服务器,和Tomcat一样,专门解释JavaWeb程序的服务器.因为在之前学习Java Web 的 ...
- Android学习笔记:多个AsyncTask实例的并发问题
AsyncTask是Android给开发者提供的一个简单轻量级的多线程类,通过它我们可以很容易新建一个线程让在后台做一些耗时的操作(如IO操作.网络访问等),并在这个过程中更新UI.之所以说它轻量级, ...
- iOS动画中的物理知识应用之愤慨的小鸟-碰撞检測
碰撞检測 源码:https://github.com/Esdeath/collsion 我相信搞iOS得人.多多少少都知道 弹球这个小游戏. 撞击不同的点,就能改变其运动的轨迹.对于非常多人来说,假设 ...
- 知识管理——得到CEO脱不花女士的一次分享
知识管理--得到CEO脱不花女士的一次分享 近日,公司举办了一场"CKO首席知识官"研讨会,邀请到了得到APP的CEO脱不花女士做了一场精彩的分享,让我深受启发. 分享内容围绕3个 ...
- Android开发学习之路-机器学习库(图像识别)、百度翻译
对于机器学习也不是了解的很深入,今天无意中在GitHub看到一个star的比较多的库,就用着试一试,效果也还行.比是可能比不上TensorFlow的,但是在Android上用起来比较简单,毕竟Tens ...
- 推荐--《Android深入浅出》
基本信息 书名:Android深入浅出 作者:张旸 著 页数: 661 出版社: 机械工业出版社; 第1版 (2014年4月17日) 语种: 简体中文 ASIN: B00JR3P8X0 品牌: 北京华 ...
- MVC利用Routing实现多域名绑定一个站点、二级域名以及二级域名注册Area
最近有这么个需求:在一个站点上绑定多个域名,每个域名进去后都要进入不同的页面.实现了这个功能以后,对于有多个域名,且有虚拟空间,但是虚拟空间却只匹配有一个站点的用户来说,可以节省很多小钱钱. 很久以前 ...
- 开班典礼-老师玩命的教,大家玩命的学,沉静,18K
接下来的四个月决定我的命运,三年前决定现在,现在决定三年后.喜讯,双元安卓四期,1368$,到第二期仍然不成熟,打分意见多写, 孙健:15011386618 喊出你 的目标.自己监督不了自己,别人可能 ...
- 深入学习Android有关网络连接的内容
基于实际项目中碰到的些许问题,开始重新深入学习Android网络连接有关知识. Android的4.1.2版本的AndroidHttpClient模块setSoTimeout之后实际超时时间和设置的时 ...
随机推荐
- 【SQL.基础构建-第一节(1/4)】
-- Tips:数据库与sql-- 一.What's 数据库-- 1.数据库(Database,DB):将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合.-- ...
- 玩一玩基于Token的 自定义身份认证+权限管理
使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录.大概的流程是这样的: 客户端使用用户名跟密码请求登录 服务端收到请求,去验证用户名与密码 验证成功后,服务端会签发一个 Toke ...
- Java 嵌套类基础详解
目录 1. 什么是嵌套类? 2. 为什么要使用嵌套类? 3. 嵌套类的类型 4. 静态嵌套类 5. 非静态嵌套类 5.1 成员内部类 5.2 局部内部类 5.3 匿名内部类 6. 嵌套接口 1. 什么 ...
- mybatis学习二
Mybatis缓存1:缓存的概念 当用户频繁查询某些固定 的数据时,第一次将这些数据从数据库查询出来,保存在缓存中(内存,高速磁盘)中 当下次用户再次查询这些数据时,不用再通过数据库查询, ...
- 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 ...
- [HNOI2014]世界树
题目描述 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里,公平是使世界树能够生生不息.持续运转的根本基 ...
- [HZOI 2015]疯狂的机器人
[题目描述] 现在在二维平面内原点上有一只机器人 他每次操作可以选择向右走,向左走,向下走,向上走和不走(每次如果走只能走一格) 但是由于本蒟蒻施展的大魔法,机器人不能走到横坐标是负数或者纵坐标是负数 ...
- 亲戚(relative)
[题目背景] Y 家是世界上最大的家族,HJZ 是其中一员. 现在 Y 家人想要拍一张全家福,却发现这是一个十分复杂的问题. . . . . . [题目描述] Y 家一共有 n 人 其中每个人最多有一 ...
- 【BZOJ1483】【HNOI2009】梦幻布丁
题意:n个连续的点,有若干种颜色,每个颜色会因为某些操作变为另一种颜色,动态查询颜色段数. 解题思路:对每个颜色开一棵平衡树启发式合并应该是最裸的想法,但是我们有更优的! 考虑对每个颜色利用链表储存它 ...
- 【NOIP2016】愤怒的小鸟
题目描述 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形 ...