Android Asynctask
2016-08-05 17:25
176 查看
简介
Asynctask , 可以开启一个多线程执行任务,并且多线程的数据传递也是这个类自己完成。Asynctask 相比 thread 和handler 更加轻量级一点。使用
首先继承Asynctask<Params,Progress,Result>类 ,并必须实现doInBackground(..)方法
范型参数说明:
Params:后台任务的输入参数,比如http请求的目标urlProgress:后台任务执行的进度
Result:后台任务返回的结果,比如Api调用返回的json数据
方法:
onPreExecute(), UI线程调用,在后台任务执行前调用,可以做一些准备工作,可以不实现。doInBackground(Params…),后台线程执行,耗时的任务写在这里,必须实现。在这个方法里可以调用publishProgress方法来更新后台任务的实时进度。
onProgressUpdate(Progress…),UI线程执行,在publishProgress方法被调用后,UI线程调用它来显示任务的进度,如在进度条上显示,或textView上显示百分比。
onPostExecute(Result),UI线程调用,doInBackground()执行完成后被调用,可以返回后台任务执行的结果。
onCancelled(),UI线程主动调用,有两个,有参数,无参数,来取消后台任务的执行,如activity被销毁,但是后台任务还没完成,就需要在activity的onDestory()方法中调用Asynctask实例的onCancelled()方法。
注意事项
主动调用asynctask的cancel方法,他会执行完doInBackground方法,然后执行onCancelled方法,不执行onPostExecute方法了。(除非在doInBackground方法中“定期检查”isCancelled()是否为true ,若为true 直接返回也行。)asynctask一个实例只能execute一次。
源码中有参数的onCancelled直接调了无参数的那个函数。
protected void onCancelled(Result result) { onCancelled(); }
比较service,Thread,IntentService,AsyncTask
Service | Thread | IntentService | AsyncTask | |
---|---|---|---|---|
什么时候去用? | 没有界面的任务,但是不能太长。对于长时间的任务,在服务中使用多线程 | -通常是长时间的任务。 -并行的任务使用多线程(传统机制) | -长任务没有经常和主线程进行交互 -如果必须交互,可以使用主线程handle或者broadcast intents -当需要回调时候(intent启动任务) | -长任务需要和主线程交互 -并行任务使用多实例或执行器 |
触发,启动 | 使用方法onStartService() | 方法:Thread start() | intent | 调用方法execute() |
触发的线程 | 任何线程 | 任何线程 | 主线程 | 主线程 |
运行的线程 | 主线程 | 它自己的线程 | 单独的工作线程 | 工作线程,但是 |
局限/缺点 | 可能阻塞主线程 | -手动线程控制 -代码可能很难去阅读 | -不能并行执行任务 -多个意图会在同一个工作线程排队 | -一个实例只能被执行一次(因此不能在一个循环中执行) -必须在主线程中创建和执行 |
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories