今天讲一讲AsyncTask的基本知识。
1.概念:
AsyncTask是Android提供的轻量级的异步类,本质上就是一个封装了线程池和handler的异步框架;
2.使用方法
(1)三个参数
(A)Params:参数的类型;
(B)Progress:后台任务执行进度的类型
(C)Result:后台任务的返回结果的类型
(2)五个方法
(A)onPreExcute():做一些初始化操作,在UI线程中执行
(B)doInBackground(Params... params):在线程池中运行,此方法用于执行异步任务,params参数表示异步任务的输入参数,在此方法中可以调用publishProgress方法来更新任务进度;
(C)onProgressUpdate(Progress... update):在主进程中执行,当后台任务执行进度发生改变时会调用此方法;
(D)onPostExecute(Result result):在主线程中运行,异步任务完成之后,调用此方法
(E)onPublishProgress():刷新线程;
代码实例:
新建AsyncTaskFace类继承AsyncTask
public class AsyncTaskFace extends AsyncTask<Integer,Integer,String> { TextView textView; ProgressBar progressBar; public AsyncTaskFace(TextView textView,ProgressBar progressBar) { this.textView=textView; this.progressBar=progressBar; } @Override protected String doInBackground(Integer... params) { int i; for (i=10;i<100;i+=10){ publishProgress(i); } return i+params[0].intValue()+""; } @Override protected void onPreExecute() { textView.setText("开始执行异步任务"); } @Override protected void onPostExecute(String s) { textView.setText("异步任务执行结束 " +s); } @Override protected void onProgressUpdate(Integer... values) { int value=values[0]; progressBar.setProgress(value); } }
在MainActivity的onCreate中调用
AsyncTaskFace asyncTaskFace=new AsyncTaskFace(textView,progressBar); asyncTaskFace.execute(2017);
3.机制原理:
(1)本质上是一个静态线程池,AsyncTask派生出来的子类可以实现不同的异步任务,这些任务都是提交到静态线程池中执行的;
(2)线程池中的工作线程执行DoInBackground()执行异步任务
(3)当任务状态改变后,工作线程会向UI线程发送消息,AsyncTask内部的InternalHandler响应这些消息,并调用相关回调函数
4.AsyncTask的注意事项:
(1)内存泄漏,原理和上一篇的handler相同,都是非静态内部类持有外部类的引用,导致外部类无法及时回收;
(2)生命周期:在Activity的onDestroy()中调用cancel()方法
(3)结果丢失:在屏幕旋转/Activity意外结束时,Activity被创建,而AsyncTask会拥有之前Activity的引用,会导致结果丢失;