安卓的非同步任務AsyncTask

來源:互聯網
上載者:User

標籤:

今天作者學習了安卓的非同步任務,非同步任務聽起來是個好高大上的東西,其實並沒有好高大上。

非同步任務到底是什麼東西呢?廣泛地講非同步任務就是以多線程的方式完成的功能需求,相對於同步

而言,非同步任務就是可以先完成第一步,開啟一個線程完成第二步,而不需要等待第二步的完成就可

以去做第三步的事情。而同步任務就是要按順序的完成任務,先完成第一步,在完成第二步,才能開始

第三步的事情。在安卓中非同步任務值得就是AsyncTask這個類。這個類其實就是對Thread+Handler的封裝

我們使用這個類就可以很簡單地完成非同步任務,像填空一樣而不需要自己來設計流程。而且AsyncTask封裝

了線程池,這樣比直接使用Thread更有效率。

 

說了這麼多,那下面我們就來講講AsyncTask的使用吧。

AsyncTask的使用很簡單,首先建立AsyncTask對象,然後調用它的execute(Params)方法就可以了。下面貼上代碼再一步一步分析。

new AsyncTask<String, Integer, String>(){            protected void onPreExecute() {                System.out.println("onPreExecute");            };                        @Override            protected String doInBackground(String... params) {                System.out.println("doInBackground......."+params[0]);                publishProgress(1);                return "這是返回的結果集";            };                        protected void onPostExecute(String result) {                System.out.println("onPostExecute....."+result);            };                        protected void onProgressUpdate(Integer[] values) {                System.out.println("onProgressUpdate......"+values[0]);            };                                }.execute("這是參數");

從上面代碼中我們可以看到建立AsyncTask對象需要傳入三個泛型。

AsyncTask<Params, Progress, Result>

 

 

Params 啟動任務執行的輸入參數,比如HTTP請求的URL。

第一個泛型用來限制execute(Params)和doInBackground(Params)方法傳入參數的類型,在execute方法中傳入的參數會在doInBackground回調方法中被使用。

Progress 背景工作執行的百分比。

第二個泛型用來限制onProgressUpdate(Progress)和publishProgress(Progress)方法傳入參數的類型,在publishProgress方法中傳入的參數會在onProgressUpdate回調方法中被使用。

Result 後台執行任務最終返回的結果,比如String。

第三個泛型是用來限制Result doInBackground的傳回值和onPostExecute(Result)方法傳入參數的類型,在doInBackground中返回的結果會在onPostExecute回調方法中被使用

 

下面就是執行結果:

08-06 12:28:33.680: I/System.out(1367): onPreExecute08-06 12:28:33.710: I/System.out(1367): doInBackground.......這是參數08-06 12:28:33.720: I/System.out(1367): onProgressUpdate......108-06 12:28:33.720: I/System.out(1367): onPostExecute.....這是返回的結果集

 

下面貼上AsyncTask類各個方法的作用和用法:

execute(Params... params) 啟動任務, 開始任務的執行流程

 

 

void onPreExecute() 在分線程工作開始之前在UIThread中執行,一般用來顯示提示視圖

 

 

Result doInBackground(Params... params) 在workerThread中執行, 完成任務的主要工作,通常需要較長的時間

 

void onPostExecute(Result result)    在doInBackground()執行完後在UIThread中執行,一般用來更新介面

 

 

publishProgress(Progress... values) : 在分線程中, 發布當前進度

 

 

void onProgressUpdate(Progress... values) : 在主線程中更新進度

 

開啟非同步任務,當然也能取消非同步任務,取消非同步任務的方法如下:

調用cancle(boolean)方法取消還在執行的非同步任務,調用該方法後將會回調isCancelled()方法返回true。

在調用該方法後,onCancelled(Object)代替了onPostExecute(Object)在執行完doInBackground(Object[])後回調。為了保證當前任務儘快被取消,你應該經常檢查isCancelled()傳回值情況....

 

 

非同步任務大致的流程如下:

 

安卓的非同步任務AsyncTask

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.