博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 开发(六)AsyncTask
阅读量:6069 次
发布时间:2019-06-20

本文共 1263 字,大约阅读时间需要 4 分钟。

1:AsyncTask是多线程吗?

答:是。
2:AsyncTask与Handler相比,谁更轻量级?
答:通过看源码,发现AsyncTask实际上就是一个线程池,而网上的说法是AsyncTask比handler要轻量级,显然上不准确的,只能这样 说,AsyncTask在代码上比handler要轻量级别,而实际上要比handler更耗资源,因为AsyncTask底层是一个线程池!而 Handler仅仅就是发送了一个消息队列,连线程都没有开。
      但是,如果异步任务的数据特别庞大,AsyncTask这种线程池结构的优势就体现出来了。

AsyncTask 的优势体现在:

•线程的开销较大,如果每个任务都要创建一个线程,那么应用程 序的效率要低很多;
•线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会启动非常多的线程,系统将不堪重负。
•另外,前面已经看到,在新线程中更新UI还必须要引入handler,这让代码看上去非常臃肿。
AsyncTask定义了三种泛型类型 Params,Progress和Result。
    •Params 启动任务执行的输入参数,比如HTTP请求的URL。
    •Progress 后台任务执行的百分比。
    •Result 后台执行任务最终返回的结果,比如String。
       AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,开发者需要实现一个或几个方法。在任务的执行过程中,这些方法被自动调用。
       onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。
       doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
       onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
       onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.
        使用AsyncTask类,以下是几条必须遵守的准则:
        1) Task的实例必须在UI thread中创建
        2) execute方法必须在UI thread中调用
        3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法
        4) 该task只能被执行一次,否则多次调用时将会出现异常

转载地址:http://fffgx.baihongyu.com/

你可能感兴趣的文章
DIRECTSHOW在VS2005中PVOID64问题和配置问题
查看>>
MapReduce的模式,算法以及用例
查看>>
《Advanced Linux Programming》读书笔记(1)
查看>>
zabbix agent item
查看>>
一步一步学习SignalR进行实时通信_7_非代理
查看>>
AOL重组为两大业务部门 全球裁员500人
查看>>
字符设备与块设备的区别
查看>>
为什么我弃用GNOME转向KDE(2)
查看>>
Redis学习记录初篇
查看>>
爬虫案例若干-爬取CSDN博文,糗事百科段子以及淘宝的图片
查看>>
Web实时通信技术
查看>>
第三章 计算机及服务器硬件组成结合企业运维场景 总结
查看>>
IntelliJ IDEA解决Tomcal启动报错
查看>>
默认虚拟主机设置
查看>>
七周五次课(1月26日)
查看>>
Linux系统一些系统查看指令
查看>>
php中的短标签 太坑人了
查看>>
[译] 可维护的 ETL:使管道更容易支持和扩展的技巧
查看>>
### 继承 ###
查看>>
数组扩展方法之求和
查看>>