概述
定义
- 一个
Android
已封装好的轻量级异步类 - 属于抽象类,即使用时需 实现子类
1 | public abstract class AsyncTask<Params, Progress, Result> { |
作用
- 实现多线程
在工作线程中执行任务,如 耗时任务 - 异步通信、消息传递
实现工作线程 & 主线程(UI
线程)之间的通信,即:将工作线程的执行结果传递给主线程,从而在主线程中执行相关的UI
操作 - 进而保证线程安全
优点
- 方便实现异步通信
不需使用 “任务线程(如继承Thread
类) +Handler
”的复杂组合 - 节省资源
采用线程池的缓存线程 + 复用线程,避免了频繁创建 & 销毁线程所带来的系统资源开销
类&方法学习
类
AsyncTask
类属于抽象类,使用时需要实现子类
1 | public abstract class AsyncTask<Params, Progress, Result> { |
核心方法
方法执行顺序如下:
使用
AsyncTask
的使用步骤有3个:
- 创建
AsyncTask
子类 & 根据需求实现核心方法 - 创建
AsyncTask
子类的实例对象(即 任务实例) - 手动调用
execute()
从而执行异步线程任务
详细如下:
1 | /** |
实例Demo
activity_main.xml
1 |
|
MainActivity.java
1 | public class MainActivity extends AppCompatActivity { |
效果
Demo地址
https://github.com/Commandercc/DemoEX/blob/master/AsyncTaskDemo.zip
问题说明
关于生命周期
结论
AsyncTask
不与任何组件绑定生命周期使用建议
在Activity
或Fragment
中使用AsyncTask
时,最好在Activity
或Fragment
的onDestory()
调用cancel(boolean)
;
内存x泄露
结论
若AsyncTask
被声明为Activity
的非静态内部类,当Activity
需销毁时,会因AsyncTask
保留对Activity
的引用 而导致Activity
无法被回收,最终引起内存泄露使用建议
AsyncTask
应被声明为Activity
的静态内部类
线程任务执行结果 丢失
结论
当Activity
重新创建时(屏幕旋转 /Activity
被意外销毁时后恢复),之前运行的AsyncTask
(非静态的内部类)持有的之前Activity
引用已无效,故复写的onPostExecute()
将不生效,即无法更新UI操作使用建议
在Activity
恢复时的对应方法 重启任务线程