標籤:
今天作者學習了安卓的非同步任務,非同步任務聽起來是個好高大上的東西,其實並沒有好高大上。
非同步任務到底是什麼東西呢?廣泛地講非同步任務就是以多線程的方式完成的功能需求,相對於同步
而言,非同步任務就是可以先完成第一步,開啟一個線程完成第二步,而不需要等待第二步的完成就可
以去做第三步的事情。而同步任務就是要按順序的完成任務,先完成第一步,在完成第二步,才能開始
第三步的事情。在安卓中非同步任務值得就是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