欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Android中AsyncTask機(jī)制

 更新時(shí)間:2015年12月29日 10:54:15   作者:我愛(ài)物聯(lián)網(wǎng)  
在Android當(dāng)中,提供了兩種方式來(lái)解決線程直接的通信問(wèn)題,一種是通過(guò)Handler的機(jī)制,還有一種就是今天要詳細(xì)講解的 AsyncTask 機(jī)制,對(duì)android中asynctask相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧

在Android當(dāng)中,提供了兩種方式來(lái)解決線程直接的通信問(wèn)題,一種是通過(guò)Handler的機(jī)制,還有一種就是今天要詳細(xì)講解的 AsyncTask 機(jī)制。

AsyncTask                                                                               

AsyncTask,是android提供的輕量級(jí)的異步類(lèi),可以直接繼承AsyncTask,在類(lèi)中實(shí)現(xiàn)異步操作,并提供接口反饋當(dāng)前異步執(zhí)行的程度(可以通過(guò)接口實(shí)現(xiàn)UI進(jìn)度更新),最后反饋執(zhí)行的結(jié)果給UI主線程.

怎么來(lái)理解AsyncTask呢?通俗一點(diǎn)來(lái)說(shuō),AsyncTask就相當(dāng)于Android給我們提供了一個(gè)多線程編程的一個(gè)框架,其介于Thread和Handler之間,我們?nèi)绻x一個(gè)AsyncTask,就需要定義一個(gè)類(lèi)來(lái)繼承AsyncTask這個(gè)抽象類(lèi),并實(shí)現(xiàn)其唯一的一個(gè) doInBackgroud 抽象方法。

3個(gè)泛型參數(shù):

AsyncTask <Params, Progress, Result>

 •Params: 啟動(dòng)任務(wù)執(zhí)行的輸入?yún)?shù),比如HTTP請(qǐng)求的URL。
 •Progress: 臺(tái)任務(wù)執(zhí)行的百分比。
 •Result: 后臺(tái)執(zhí)行任務(wù)最終返回的結(jié)果,比如String。

如果都不指定的話,則都將其寫(xiě)成Void,例如:

AsyncTask <Void, Void, Void> •onPreExecute(): 這個(gè)方法是在執(zhí)行異步任務(wù)之前的時(shí)候執(zhí)行,并且是在UI Thread當(dāng)中執(zhí)行的,通常我們?cè)谶@個(gè)方法里做一些UI控件的初始化的操作,例如彈出要給ProgressDialog

 •doInBackground(Params... params): 在onPreExecute()方法執(zhí)行完之后,會(huì)馬上執(zhí)行這個(gè)方法,這個(gè)方法就是來(lái)處理異步任務(wù)的方法,Android操作系統(tǒng)會(huì)在后臺(tái)的線程池當(dāng)中開(kāi)啟一個(gè)worker thread來(lái)執(zhí)行我們的這個(gè)方法,所以這個(gè)方法是在worker thread當(dāng)中執(zhí)行的,這個(gè)方法執(zhí)行完之后就可以將我們的執(zhí)行結(jié)果發(fā)送給我們的最后一個(gè) onPostExecute 方法,在這個(gè)方法里,我們可以從網(wǎng)絡(luò)當(dāng)中獲取數(shù)據(jù)等一些耗時(shí)的操作

 •onProgressUpdate(Progess... values): 這個(gè)方法也是在UI Thread當(dāng)中執(zhí)行的,我們?cè)诋惒饺蝿?wù)執(zhí)行的時(shí)候,有時(shí)候需要將執(zhí)行的進(jìn)度返回給我們的UI界面,例如下載一張網(wǎng)絡(luò)圖片,我們需要時(shí)刻顯示其下載的進(jìn)度,就可以使用這個(gè)方法來(lái)更新我們的進(jìn)度。這個(gè)方法在調(diào)用之前,我們需要在 doInBackground 方法中調(diào)用一個(gè) publishProgress(Progress) 的方法來(lái)將我們的進(jìn)度時(shí)時(shí)刻刻傳遞給 onProgressUpdate 方法來(lái)更新

 •onPostExecute(Result... result): 當(dāng)我們的異步任務(wù)執(zhí)行完之后,就會(huì)將結(jié)果返回給這個(gè)方法,這個(gè)方法也是在UI Thread當(dāng)中調(diào)用的,我們可以將返回的結(jié)果顯示在UI控件上
 •onCancelled(): 用戶調(diào)用取消時(shí),要做的操作

 代碼    

public class yibu extends AsyncTask<Integer, Integer, String> {
 private int num = 0;
 private TextView text;
 public yibu(TextView textfrom) {
  // TODO 自動(dòng)生成的構(gòu)造函數(shù)存根
  this.text = textfrom;//傳遞進(jìn)來(lái)一個(gè)TextView
 }
 @Override
 protected void onPostExecute(String result) {
  // TODO 自動(dòng)生成的方法存根
  super.onPostExecute(result);
  text.setText("異步操作執(zhí)行結(jié)束" + result);
 }
 @Override
 protected void onPreExecute() {
  // TODO 自動(dòng)生成的方法存根
  super.onPreExecute();
  text.setText("開(kāi)始執(zhí)行異步操作");
 }
 @Override
 protected void onProgressUpdate(Integer... values) {
  // TODO 自動(dòng)生成的方法存根
  super.onProgressUpdate(values);
  int value = values[0];
  System.out.println(value);
 }
 @Override
 protected String doInBackground(Integer... param) {
  // TODO 自動(dòng)生成的方法存根 
  for(;num<10;num++)
  {
   publishProgress(num);//調(diào)用onProgressUpdate()
  }
  return num + param[0].intValue() + "";//調(diào)用onPostExecute,值直接傳進(jìn)去
 }
}

PS:AsyncTask和Handler對(duì)比

1 ) AsyncTask實(shí)現(xiàn)的原理,和適用的優(yōu)缺點(diǎn)

AsyncTask,是android提供的輕量級(jí)的異步類(lèi),可以直接繼承AsyncTask,在類(lèi)中實(shí)現(xiàn)異步操作,并提供接口反饋當(dāng)前異步執(zhí)行的程度(可以通過(guò)接口實(shí)現(xiàn)UI進(jìn)度更新),最后反饋執(zhí)行的結(jié)果給UI主線程.

使用的優(yōu)點(diǎn):

簡(jiǎn)單,快捷

 過(guò)程可控   

使用的缺點(diǎn):

在使用多個(gè)異步操作和并需要進(jìn)行Ui變更時(shí),就變得復(fù)雜起來(lái).

2 )Handler異步實(shí)現(xiàn)的原理和適用的優(yōu)缺點(diǎn)

在Handler 異步實(shí)現(xiàn)時(shí),涉及到 Handler, Looper, Message,Thread四個(gè)對(duì)象,實(shí)現(xiàn)異步的流程是主線程啟動(dòng)Thread(子線程)àthread(子線程)運(yùn)行并生成Message-àLooper獲取Message并傳遞給HandleràHandler逐個(gè)獲取Looper中的Message,并進(jìn)行UI變更。

使用的優(yōu)點(diǎn):

結(jié)構(gòu)清晰,功能定義明確

對(duì)于多個(gè)后臺(tái)任務(wù)時(shí),簡(jiǎn)單,清晰

使用的缺點(diǎn):

在單個(gè)后臺(tái)異步處理時(shí),顯得代碼過(guò)多,結(jié)構(gòu)過(guò)于復(fù)雜(相對(duì)性)

相關(guān)文章

最新評(píng)論