在之前的博客中,对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开发技术。

最新文章

  1. [转] Android优秀开源项目
  2. 关于IIS部署时出现“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本”的问题解决摘要
  3. 【ShaderForge】溶解测试
  4. Object C学习笔记15-协议(protocol)
  5. Virtual Box创建共享目录
  6. 利用GBDT模型构造新特征具体方法
  7. Codevs No.3147 矩阵乘法2
  8. Map转Bean小工具
  9. Fibonacci(数论 输出前四位Fibonacci)
  10. 3391: [Usaco2004 Dec]Tree Cutting网络破坏
  11. 第一份开发工作,边学边做android
  12. [数据结构]C语言栈的实现
  13. VSTO学习问题(一)
  14. 剑指Offer 9. 变态跳台阶 (递归)
  15. PHP实现字符串转义和还原
  16. ubuntu重启+sublime快捷键
  17. Linux服务器mysql,nginx等自动停止的排查,以及解决方法
  18. koa2使用阿里云oss的nodejs sdk实现上传图片
  19. 关于RM中的X3014错误,以及mul() 、天空盒
  20. php中empty(),isset(),is_null(),==,===区别

热门文章

  1. RPC服务和HTTP服务
  2. [LeetCode] Set Mismatch 设置不匹配
  3. 原生Js操作DOM
  4. mysql列约束
  5. rmdir&amp;rm
  6. [AHOI2006]基因匹配
  7. [HNOI2015]菜肴制作
  8. 洛谷P2388 阶乘之乘
  9. [JLOI2015]城池攻占 左偏树
  10. Codeforces #Round 406(Div.2)