首先,从名字上看AsyncTask 全称 synchronious task 汉语意思可以理解为异步任务。它可以实现一个后台线程,并且可以将结果上交到UI线程。
定义一个AsyncTask需要三个属性,它们分别是Params、Progress、Result。这三个属性我们会在下面讲解。除此以外,当一个asynchronous task执行后,将会经过4个步骤,即四个回调函数的调用。
下面我们给出一个AsyncTask的例子,这个例子来源于Android SDK,有兴趣的可以自己去看看。
AsyncTask子类的实现:
private
class
DownloadFilesTask
extends
AsyncTask
<
URL
,
Integer
,
Long
>
{
protected Long doInBackground ( URL ... urls ) {
int count = urls . length ;
long totalSize = 0 ;
for ( int i = 0 ; i < count ; i ++) {
totalSize += Downloader . downloadFile ( urls [ i ]);
publishProgress (( int ) (( i / ( float ) count ) * 100 ));
}
return totalSize ;
}
protected void onProgressUpdate ( Integer ... progress ) {
setProgressPercent ( progress [ 0 ]);
}
protected void onPostExecute ( Long result ) {
showDialog ( "Downloaded " + result + " bytes" );
}
}
protected Long doInBackground ( URL ... urls ) {
int count = urls . length ;
long totalSize = 0 ;
for ( int i = 0 ; i < count ; i ++) {
totalSize += Downloader . downloadFile ( urls [ i ]);
publishProgress (( int ) (( i / ( float ) count ) * 100 ));
}
return totalSize ;
}
protected void onProgressUpdate ( Integer ... progress ) {
setProgressPercent ( progress [ 0 ]);
}
protected void onPostExecute ( Long result ) {
showDialog ( "Downloaded " + result + " bytes" );
}
}
在UI线程中的执行上面定义的AsyncTask的子类DownFilesTask
new DownloadFilesTask().execute(url1, url2, url3);
现在让我们结合着开始的文字来了解AsyncTask
在上面类的定义中有这样一句话:
private
class
DownloadFilesTask
extends
AsyncTask
<
URL
,
Integer
,
Long
>
这里的URL,Integer,Long便对应着所说过的Params,Progress, Result。这三个属性到底有什么用呢?我们暂时把它放一下,接着来看那四个步骤。
四个步骤,即四个回调函数,它们分别是:
- onPreExecute() 由UI线程在Task执行后紧接着调用.。一般用来进行一些初始化操作。
- doInBackground(Params...) 由后台进程在onPreExecute()执行完毕后调用.。这个便是处理那些耗时操作的地方了。在该函数中,你可以手动调用publishProgress(Progress...) 来向主线程传递程序的执行进度。而这个publishProgress(Progress...)实质上是将参数传递给了onProgressUpdate(Progress),通过这个方法实现向UI线程上交信息。
onProgressUpdate(Progress...) 当UI线程调用了
doInBackground(Params...)后调用(看准,不是执行完成)。它的执行时间不确定。它用于向UI线程报告当前程序执行进度。例如,它可以更新UI中的一个进度条,用于显示这个线程的执行进度。
- onPostExecute(Result...) 由UI线程在后台操作执行完成后调用,它的参数便是由doInBackground(Params...)返回的值。
现在我们已经大体的了解了AsyncTask的机制。
大家可以结合着代码来理解,最好是亲自去看看Android SDK,它是任何参考书都比不上的。
最重要一点一个AsynTask只能使用一次,且只能在UI线程中实例化。
根据我的学习经历,我希望还不太了解同学可以尝试去搞懂以下两个问题:
1、三个属性在四个步骤中的分别的位置和作用(在哪个函数里,是函数的形参还是返回值)。
2、在UI线程中执行AsyncTask时传入的参数对应哪个属性,去了哪里,如何在接收到它的函数中使用。
更加详细的分析我会在不久找时间贴出来。
由于本人也是菜鸟一个,对android理解不深,难免会出现各种理解上的错误,希望大家给予指正!!
最好的学习是要自己去找寻思路,而不是只走在别人的路上。