前言
之前执行异步任务,都是采用Thread+Handler模式,为每个任务创建一个线程,需要更新UI时,通过Handler发送消息通知主线程执行相应操作。一直用开,虽然代码臃肿点,但功能上还是能实现。最近这个项目就出现了问题,需要频繁地在几个操作中循环执行,就需要不断地new Thread,数量一多起来,就无法实现对线程的精确控制了。
源码分析
async task 源码很短,总共都不到700行,我们直接从源码入手,看一下它的实现套路。
AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread withouthaving to manipulate threads and/or handlers.
注释的第一部分就道出了 async task的主要作用:提供了一种更合理、更便利的方式用于更新ui.
构造函数
public abstract classAsyncTask<Params,Progress,Result> {...}
publicAsyncTask() {...}
系统提供了两个构造函数,一个是带参的,一个是无参的,用户可根据自己业务需要来构建。带参方法的三个参数含义如下:
Params, the type of the parameters sent to the task upon * execution.(启动任务时的输入参数)
Progress, the type of the progress units published during * the background computation.(执行任务的进度)
Result, the type of the result of the background * computation.(返回结果的类型)
核心方法
1.execute:
源码:
@MainThread
public finalAsyncTaskexecute(Params... params){
return executeOnExecutor(sDefaultExecutor,params);
}
主线程调用此方法,触发异步线程的执行。
2.onPreExecute:
源码:
/** Runs on the UI thread before {@link#doInBackground}
@see#onPostExecute
@see#doInBackground*/
@MainThread
protected void onPreExecute() {}
异步线程被触发后,立即被执行,主要用于初始化UI,如将进度条的值设为0。
3.doInBackground:
源码:
/*Override this method to perform a computation on a background thread*/
@WorkerThread
protected abstract Result doInBackground(Params... params);
执行耗时操作,并返回执行类型的结果。可通过调用publishProgress(Progress... values)更新任务进度消息。
4.onProgressUpdate:
源码:
/** Runs on the UI thread after {@link#publishProgress} is invoked.*/
@MainThread
protected void onProgressUpdate(Progress... values) {}
用于更新UI,如更新进度条当前值:progressBar.setProgress(values[0]);
5.onPostExecute:
源码:
/*Runs on the UI thread after {@link#doInBackground}*/
@MainThread
protected voidonPostExecute(Resultresult) {}
后台耗时操作完成后,该方法被调用,主要执行更新UI操作,如:imageView.setImageBitmap(bitmap);
执行流程
使用示例
效果图:
待研究:
1.async task 局限性。
2.不同版本的兼容性。
3.进一步分析源码。
网友评论