您的位置:首页 > 产品设计 > UI/UE

AsyncTask实现多线程 (简要分析)

2011-09-10 13:05 302 查看
首先,从名字上看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");

     }

 }

 
在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理解不深,难免会出现各种理解上的错误,希望大家给予指正!!

最好的学习是要自己去找寻思路,而不是只走在别人的路上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息