经典回答

那我们考查 AsyncTask 会问些什么呢?得先问问会不会用吧,看看知不知道有 onProgressUpdate 方法。

其次问一下是怎么理解 AsyncTask 的机制,有没有看过它的源代码?

这个问题主要看对方是否对 Android 的东西有好奇心,会主动去看 AsyncTask 的源码,或者能大体地讲清楚 AsyncTask 的原理。一般有好奇心的同学都比较善长学习,善长学习的人都能比较快融入团队。

AnsycTask 执行任务时,内部会创建一个进程作用域的线程池来管理要运行的任务,也就就是说当你调用了 AsyncTask.execute() 后,AsyncTask 会把任务交给线程池,由线程池来管理创建 Thread 和运行 Therad 。最后和 UI 打交道就交给 Handler 去处理了。

线程池可以同时执行多少个 TASK?

Android 3.0 之前(1.6之前的版本不再关注)规定线程池的核心线程数为5个(corePoolSize),线程池总大小为 128(maximumPoolSize),还有一个缓冲队列(sWorkQueue,缓冲队列可以放10个任务),当我们尝试去添加第139个任务时,程序就会崩溃。当线程池中的数量大于 corePoolSize,缓冲队列已满,并且线程池中的数量小于 maximumPoolSize,将会创建新的线程来处理被添加的任务。如下图会出现第16个Task比第6-15个Task先执行的情况。

多个AsyncTask任务是串行还是并行?

从Android 1.6到2.3(Gingerbread) AsyncTask是并行的,即上面我们提到的有5个核心线程的线程池(ThreadPoolExecutor)负责调度任务。从Android 3.0开始,Android团队又把AsyncTask改成了串行,默认的Executor被指定为SERIAL_EXECUTOR。

    /*** An {@link Executor} that executes tasks one at a time in serial* order.  This serialization is global to a particular process.*/public static final Executor SERIAL_EXECUTOR = new SerialExecutor();

从它的说明也可以看出是串行的。如需要并行,可以通过设置executeOnExecutor(Executor)来实现多个AsyncTask并行。

    public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec,Params... params) {

AsyncTask容易引发的Activity内存泄露

如果AsyncTask被声明为Activity的非静态的内部类,那么AsyncTask会保留一个对创建了AsyncTask的Activity的引用。如果Activity已经被销毁,AsyncTask的后台线程还在执行,它将继续在内存里保留这个引用,导致Activity无法被回收,引起内存泄露。

当然,最后少不了问一句:“你在项目中,会用什么方案来替换AsyncTask呢?”

不过,学习它对理解Android的机制和线程池的使用还是很的意义的,所以强烈建议大家读一下它的源码。

你的朋友是不是也在准备面试呢?你可以把今天的题目分享给好友,或许你可以帮到他。

Android -- 每日一问:在项目中使用AsyncTask会有什么问题吗?相关推荐

  1. 前端vue适配不同的分辨率_前端面试时,被问到项目中的难点有哪些?

    在每个前端求职者的面试过程中,一定都有过被面试官问到项目中的难点,而答不上来的情况.为了让大家在前端面试前准备得更加充足,小编准备了一些易被忽视且难度较高的前端面试题,希望可以帮助大家更加顺利完成求职 ...

  2. 使用zinnia制作android手写输入功能(下)-------------------在项目中使用zinnia

    使用zinnia制作android手写输入功能(下)-------------------在项目中使用zinnia

  3. 缓存三连问:项目中如何使用、为什么要使用、使用不当会造成什么后果?

    点击关注公众号,利用碎片时间学习 问题 项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果? 分析 这个问题,互联网公司必问,要是一个人连缓存都不太清楚,那确实比较尴尬. 只要问到缓存 ...

  4. Android设计模式之观察者模式在项目中的实际使用总结

    前言 观察者模式在Android开发中使用频率非常高,最常用的地方如订阅–发布系统,类似微信公众号用户订阅和接收消息的场景,因为这个模式最重要的功能就是解耦,将被观察者和观察者解耦,使得它们之间的依赖 ...

  5. 【数据使用】3问视觉项目中的数据整理,这点小事你是不是都掌握好了?

    大家好,欢迎来到我们的技术专栏<数据使用>,这一个专栏主要讲解在深度学习技术中数据使用相关的内容. 作者&编辑 | 言有三 今天要介绍的是一个小问题,那就是对于数据的整理.在大部分 ...

  6. android每日一问【2011-8-26】

    Android布局属性详解 listview多选的一个问题 关于动画参数设置的问题,在线等,谢谢啦. 对话框简单应用 listview下面显示一些东西.代码写上去.可是运行起来看不到 搭建Androi ...

  7. android图片缓存,直接应用项目中的Android图片缓存技术

    前不久搞的Android图片缓存,刚开始引入开源的框架,用着还行,但是在开发中遇到问题,就比如universal-image-loader-1.9.5.jar这个框架吧,在加载图片的时候自定义imag ...

  8. java面试中被问到项目中的难点怎么回答?

    01.项目描述 消息推送平台承接着站内对各种类型渠道的消息下发,每天承载亿级流量推送.项目主要对用户侧的召回(营销)以及通知消息触达,也同时负责对内网的告警和通知消息发送. 在真正面试的过程中,当面试 ...

  9. Android -- 每日一问:如何设计一个照片上传 app ?

    经典回答 把自己放在一个面试官的角度,自己先实现一次这个 App ,然后自己总结一下你在这次实现中需要哪些能力.需要注意哪些事项.最后,再回过头来看,如果你是面试官,你希望面试者怎么回答才算是符合你的 ...

最新文章

  1. 微软收购 GitHub 两年后,大咖共论开源新生态
  2. mariadb 基础使用
  3. 华南农业大学在Annual Review of Microbiology发表三篇综述文章
  4. 什么是事务的传播_这么漂亮的Spring事务管理详解,你不来看看?
  5. SAP QM 模块的弊端?
  6. HDLBits 系列(25)独热码有限状态机实现的简单方式
  7. linux常见协议对应端口(后期补充)
  8. linux mysql io压力大_MySQL 调优基础(四) Linux 磁盘IO_MySQL
  9. 线性代数、概率 入门书籍推荐
  10. mysql8.0windows,Windows下mysql 8.0.12 安装详细教程
  11. 自定义一个可复用的BaseAdapter
  12. 案例 | 省去繁琐简历筛选,「微伴助手」选择 ShowMeBug 在线笔试提高人才精准度
  13. python柱状图纵轴刻度_Python数据分析:Matplotlib
  14. 数据库查询优化(转载)
  15. 有什么文字转语音软件?这几个软件你不能不知道
  16. python竖着展示诗_竖着写诗的格式
  17. 半同步半异步模式以及Leader_Follwer模式
  18. WPF自定义控件(教程含源码)-圆形进度条、环形进度条
  19. 区块链学习三——比特币的数据结构
  20. Input搜索框与搜索图标对齐解决方法

热门文章

  1. Java中boolean型变量的默认值问题
  2. Java实例——线程
  3. Solr - DIH详解(上卷)
  4. 汽车/车载/自动驾驶/辅助驾驶相关认知记录
  5. linux怎么sftp传文件,Linux 如何使用SFTP命令传输文件
  6. android开发双击唤醒屏幕,安卓手机双击唤醒原理是什么 安卓双击唤醒原理介绍...
  7. 4.4.1小问题集锦
  8. 笔记:计算机公共基础知识学习内容(总)——全国计算机二级考试
  9. 人工学习之预测2023年考研英语答案分布
  10. windows全局消息钩子的一个BUG