国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

android AsyncTask詳細(xì)介紹

2019-12-12 04:36:05
字體:
供稿:網(wǎng)友

AsyncTask和Handler對(duì)比

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

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

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

  • 簡單,快捷
  • 過程可控 

使用的缺點(diǎn):

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

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í),簡單,清晰

使用的缺點(diǎn):

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

 AsyncTask介紹

Android的AsyncTask比Handler更輕量級(jí)一些,適用于簡單的異步處理。

首先明確Android之所以有Handler和AsyncTask,都是為了不阻塞主線程(UI線程),且UI的更新只能在主線程中完成,因此異步處理是不可避免的。

Android為了降低這個(gè)開發(fā)難度,提供了AsyncTask。AsyncTask就是一個(gè)封裝過的后臺(tái)任務(wù)類,顧名思義就是異步任務(wù)。

AsyncTask直接繼承于Object類,位置為android.os.AsyncTask。要使用AsyncTask工作我們要提供三個(gè)泛型參數(shù),并重載幾個(gè)方法(至少重載一個(gè))。

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。

使用過AsyncTask 的同學(xué)都知道一個(gè)異步加載數(shù)據(jù)最少要重寫以下這兩個(gè)方法:

  • doInBackground(Params…) 后臺(tái)執(zhí)行,比較耗時(shí)的操作都可以放在這里。注意這里不能直接操作UI。此方法在后臺(tái)線程執(zhí)行,完成任務(wù)的主要工作,通常需要較長的時(shí)間。在執(zhí)行過程中可以調(diào)用publicProgress(Progress…)來更新任務(wù)的進(jìn)度。
  • onPostExecute(Result)  相當(dāng)于Handler 處理UI的方式,在這里面可以使用在doInBackground 得到的結(jié)果處理操作UI。 此方法在主線程執(zhí)行,任務(wù)執(zhí)行的結(jié)果作為此方法的參數(shù)返回

有必要的話你還得重寫以下這三個(gè)方法,但不是必須的:

  • onProgressUpdate(Progress…)   可以使用進(jìn)度條增加用戶體驗(yàn)度。 此方法在主線程執(zhí)行,用于顯示任務(wù)執(zhí)行的進(jìn)度。
  • onPreExecute()        這里是最終用戶調(diào)用Excute時(shí)的接口,當(dāng)任務(wù)執(zhí)行之前開始調(diào)用此方法,可以在這里顯示進(jìn)度對(duì)話框。
  • onCancelled()             用戶調(diào)用取消時(shí),要做的操作

使用AsyncTask類,以下是幾條必須遵守的準(zhǔn)則:

  • Task的實(shí)例必須在UI thread中創(chuàng)建;
  • execute方法必須在UI thread中調(diào)用;
  • 不要手動(dòng)的調(diào)用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個(gè)方法;
  • 該task只能被執(zhí)行一次,否則多次調(diào)用時(shí)將會(huì)出現(xiàn)異常;

一個(gè)超簡單的理解 AsyncTask 的例子:

main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   android:orientation="vertical"   android:layout_width="fill_parent"   android:layout_height="fill_parent"   >   <TextView    android:id="@+id/textView01"   android:layout_width="fill_parent"    android:layout_height="wrap_content"    />   <ProgressBar    android:id="@+id/progressBar02"   android:layout_width="fill_parent"    android:layout_height="wrap_content"    style="?android:attr/progressBarStyleHorizontal"    />   <Button   android:id="@+id/button03"   android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:text="更新progressbar"   /> </LinearLayout> 

MainActivity.java

package vic.wong.main;  import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView;  public class MainActivity extends Activity {   private Button button;   private ProgressBar progressBar;   private TextView textView;      @Override   public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);          button = (Button)findViewById(R.id.button03);     progressBar = (ProgressBar)findViewById(R.id.progressBar02);     textView = (TextView)findViewById(R.id.textView01);          button.setOnClickListener(new OnClickListener() {              @Override       public void onClick(View v) {         ProgressBarAsyncTask asyncTask = new ProgressBarAsyncTask(textView, progressBar);         asyncTask.execute(1000);       }     });   } }  

NetOperator.java

package vic.wong.main;  //模擬網(wǎng)絡(luò)環(huán)境 public class NetOperator {      public void operator(){     try {       //休眠1秒       Thread.sleep(1000);     } catch (InterruptedException e) {       // TODO Auto-generated catch block       e.printStackTrace();     }   }  } 

ProgressBarAsyncTask .java

package vic.wong.main; import android.os.AsyncTask; import android.widget.ProgressBar; import android.widget.TextView;  /**  * 生成該類的對(duì)象,并調(diào)用execute方法之后  * 首先執(zhí)行的是onProExecute方法  * 其次執(zhí)行doInBackgroup方法  *  */ public class ProgressBarAsyncTask extends AsyncTask<Integer, Integer, String> {    private TextView textView;   private ProgressBar progressBar;         public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar) {     super();     this.textView = textView;     this.progressBar = progressBar;   }     /**    * 這里的Integer參數(shù)對(duì)應(yīng)AsyncTask中的第一個(gè)參數(shù)     * 這里的String返回值對(duì)應(yīng)AsyncTask的第三個(gè)參數(shù)    * 該方法并不運(yùn)行在UI線程當(dāng)中,主要用于異步操作,所有在該方法中不能對(duì)UI當(dāng)中的空間進(jìn)行設(shè)置和修改    * 但是可以調(diào)用publishProgress方法觸發(fā)onProgressUpdate對(duì)UI進(jìn)行操作    */   @Override   protected String doInBackground(Integer... params) {     NetOperator netOperator = new NetOperator();     int i = 0;     for (i = 10; i <= 100; i+=10) {       netOperator.operator();       publishProgress(i);     }     return i + params[0].intValue() + "";   }     /**    * 這里的String參數(shù)對(duì)應(yīng)AsyncTask中的第三個(gè)參數(shù)(也就是接收doInBackground的返回值)    * 在doInBackground方法執(zhí)行結(jié)束之后在運(yùn)行,并且運(yùn)行在UI線程當(dāng)中 可以對(duì)UI空間進(jìn)行設(shè)置    */   @Override   protected void onPostExecute(String result) {     textView.setText("異步操作執(zhí)行結(jié)束" + result);   }     //該方法運(yùn)行在UI線程當(dāng)中,并且運(yùn)行在UI線程當(dāng)中 可以對(duì)UI空間進(jìn)行設(shè)置   @Override   protected void onPreExecute() {     textView.setText("開始執(zhí)行異步線程");   }     /**    * 這里的Intege參數(shù)對(duì)應(yīng)AsyncTask中的第二個(gè)參數(shù)    * 在doInBackground方法當(dāng)中,,每次調(diào)用publishProgress方法都會(huì)觸發(fā)onProgressUpdate執(zhí)行    * onProgressUpdate是在UI線程中執(zhí)行,所有可以對(duì)UI空間進(jìn)行操作    */   @Override   protected void onProgressUpdate(Integer... values) {     int vlaue = values[0];     progressBar.setProgress(vlaue);   }  } 

原文鏈接:http://www.cnblogs.com/devinzhang/archive/2012/02/13/2350070.html

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 大石桥市| 临湘市| 五莲县| 宝清县| 合江县| 即墨市| 乐亭县| 宜城市| 南昌市| 山东| 梁河县| 六安市| 南雄市| 山东| 东宁县| 共和县| 安庆市| 小金县| 阆中市| 海淀区| 海城市| 绥阳县| 宁强县| 桑植县| 江西省| 扬中市| 灯塔市| 金昌市| 孟津县| 察哈| 邛崃市| 邵阳县| 商南县| 北川| 黄浦区| 凤山县| 开阳县| 西昌市| 凭祥市| 二连浩特市| 武乡县|