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

首先,从名字上看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 )   (( /   ( 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。这三个属性到底有什么用呢?我们暂时把它放一下,接着来看那四个步骤。

四个步骤,即四个回调函数,它们分别是:

  1. onPreExecute() 由UI线程在Task执行后紧接着调用.。一般用来进行一些初始化操作。
  2. doInBackground(Params...)  由后台进程在onPreExecute()执行完毕后调用.。这个便是处理那些耗时操作的地方了。在该函数中,你可以手动调用publishProgress(Progress...)   来向主线程传递程序的执行进度。而这个publishProgress(Progress...)实质上是将参数传递给了onProgressUpdate(Progress),通过这个方法实现向UI线程上交信息。
  3. onProgressUpdate(Progress...)   当UI线程调用了doInBackground(Params...)后调用(看准,不是执行完成)。它的执行时间不确定。它用于向UI线程报告当前程序执行进度。例如,它可以更新UI中的一个进度条,用于显示这个线程的执行进度。
  4. onPostExecute(Result...)  由UI线程在后台操作执行完成后调用,它的参数便是由doInBackground(Params...)返回的值。

现在我们已经大体的了解了AsyncTask的机制。
大家可以结合着代码来理解,最好是亲自去看看Android SDK,它是任何参考书都比不上的。

最重要一点一个AsynTask只能使用一次,且只能在UI线程中实例化。

根据我的学习经历,我希望还不太了解同学可以尝试去搞懂以下两个问题:
1、三个属性在四个步骤中的分别的位置和作用(在哪个函数里,是函数的形参还是返回值)。
2、在UI线程中执行AsyncTask时传入的参数对应哪个属性,去了哪里,如何在接收到它的函数中使用。

更加详细的分析我会在不久找时间贴出来。

由于本人也是菜鸟一个,对android理解不深,难免会出现各种理解上的错误,希望大家给予指正!!


最好的学习是要自己去找寻思路,而不是只走在别人的路上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值