在之前的博客中,对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. Android系统框架构

    写此本文是为了对Android系统框架有一个整体的认识和了解,对于开发和测试人员脑子里要有整体认识以便对工作有所帮助. 进入正题 首先Android系统架构采用了分层架构的思想,共分为四层由上到下分: ...

  2. vue-router详解——小白速会

    一.概述 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用. vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来. ...

  3. QT-第一个程序 Hello QT , 以及QT creator介绍

    第一个程序 - Hello QT 首先写main.cpp: #include <QApplication> #include <QMainWindow> #include &l ...

  4. 【linux之sed及vim】

    一.sed sed 文本处理工具 流编辑器 行编辑器保留空间模式空间sed不会影响原文件的内容,它处理的是它载入模式空间的内容 sed [options].."AddressCommand& ...

  5. Cmder Windows 下的终端神器

    废话 Windows 下常用的终端有两个,古老的 cmd 和功能强大但你记不住函数的 PowerShell ,两者我都用过一段时间,给我的提体验是功能够用,界面丑陋,虽然 win10 下可以通过调整背 ...

  6. ios开发- 利用运行时(runtime)字典转模型

    现在的ios开发中,我们通常会使用MVC模式.当我们拿到数据的时候,我们要把数据转成模型使用. 一般情况我们拿到的数据都是字典.这是我们就需要将字典转成模型对象了. 当对象的属性很少的时候,我们可以直 ...

  7. Struts2--拦截器Interceptor

    拦截器是的我们可以在方法的执行前后定义执行的操作.可以作为一个非常有力的工具在数据验证,属性设置,安全,日志等等方面. 拦截器可以链接起来形成一个拦截器栈.框架会按照拦截器定义的顺序依次调用这些拦截器 ...

  8. [BZOJ 5071]小A的数字

    Description 小A成为了一个数学家,他有一串数字A1,A2...An 每次可以进行如下操作,选择一个数字i(1<i<=n),将(Ai-1,Ai,Ai+1) 变为(Ai-1 + A ...

  9. Codeforces Round #460 E. Congruence Equation

    Description 题面 \(n*a^n≡b (\mod P),1<=n<=x\) Solution 令 \(n=(P-1)*i+j\) \([(P-1)*i+j]*a^{[(P-1) ...

  10. 【NOIP2013】传染病控制

    题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带 ...