編輯:關於android開發
AsyncTask作為一個比Handler好用的消息處理類,掌握它是必須的,廢話少說,直接往下看!
-----------------------------------------------------------------------------------------------------------------
AsyncTask 是一個抽象類(public abstract class AsyncTask extends Object),如果想使用它的話,我們必須創建一個子類去繼承它。
看一下這個抽象類:android.os.AsyncTask<Params, Progress, Result>,指定了三個泛型參數,我們先分析一下這三個參數:
1. Params:在執行AsyncTask時需要傳入的參數,可用於在後台任務中使用,這麼說不懂?ok,下面代碼會告訴你怎麼用.
new DownloadTask().execute(params) --> doInBackground(Integer... params) // 這邊的Integer可以自定義
2. Progress:後台任務執行時,如果需要在界面上顯示當前的進度,則使用這裡指定的泛型作為進度單位。
3. Result:當任務執行完畢後,如果需要對結果進行返回,則使用這裡指定的泛型作為返回值類型,比如我們常使用Boolean或String類型作為返回類型。
Notice:這三個參數是泛型參數,也就是說參數類型是根據要求傳入的,所以在方法的使用過程中,一定要清晰參數類型的設定和使用。
這裡給出一個最簡單的自定義AsyncTask的方式:
class DownloadTask extends AsyncTask<Void, Integer, Boolean> {
......
}
當然,定義完一個繼承AsyncTask的子類後,我們還需要覆寫AsyncTask的幾個方法:
1. onPreExecute()
2. doInBackground(Params...)
3. onProgressUpdate(Progress...)
4. onPostExecute(Result)
下面,我們就這4個方法的使用流程作一個詳細的介紹:
onPreExecute():這個方法顧名思義,就是在異步任務處理之前需要執行的操作,那麼它操作什麼?簡單的說就是進行一些界面上的初始化操作,比如:顯示一個進度條對話框等。這個方法不是我們的重點方法,但是在使用過程中巧妙使用可以增強界面的可觀性。
protected void onPreExecute() { super.onPreExecute(); // 可以進行一些預處理 }
doInBackground(Params...):這個就是AsyncTask中最為重要的方法了,因為這個方法中的所有代碼都會在子線程中運行,我們也是在這個方法中去處理所有的耗時任務。
直接看代碼:
protected Boolean doInBackground(Integer... params) { // 這邊params是由execute()傳進來的,這個execute方法可以在下面找到答案 for (int i = 0; i < 101; i++) { publishProgress(i); // 對主線程UI進行更新操作,將調用onProgressUpdate()方法
try { Thread.sleep(params[0]); // 休眠線程 } catch (Exception e) { e.printStackTrace(); } } return true; // 任務完成後return一個結果,這邊的Boolean類型的結果 }
通過以上的代碼,我們可以發現:任務一旦完成就可以通過return語句來將任務的執行結果返回,如果AsyncTask的第三個泛型參數被指定的是Void,就可以不返回任務執行結果。
在這個方法中是不可以進行UI操作的(子線程是無法對主線程進行修改的),如果需要更新UI元素的話,就需要調用publishProgress(Progress...)方法來完成了。
onProgressUpdate(Progress...):當在後台任務中調用了publishProgress(Progress...)方法後,這個方法就會很快被調用,此方法中的參數是從哪邊傳來的,我想不需要解釋了吧。
在這個方法中,可以對UI進行操作,利用參數中的數值就可以對界面元素進行相應地更新,為什麼?上代碼!。
protected void onProgressUpdate(Integer... values) { // values[0] = i MainActivity.this.text.setText("當前進度是:" + String.valueOf(values[0]) + "%"); // 主線程進行操作 }
onPostExecute(Result):這個函數就是來執行return返回後的一些操作的,我們直接看下代碼,就能理解。
protected void onPostExecute(Boolean b) { // b --> true if (b) { Toast.makeText(getBaseContext(), "Download succeed", Toast.LENGTH_SHORT).show(); // 後續操作 } else { Toast.makeText(getBaseContext(), "Download failed", Toast.LENGTH_SHORT).show(); } }
那麼,問題來了,我們定義好了類、同時覆寫了各種方法,但是如何啟動它?
如果想要啟動這個任務,只需編寫一行代碼:new DownloadTask().execute();
protected void onCreate(Bundle savedInstanceState) { // 這個方法你不要說你不認識~ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new DownloadTask().execute(100); // 這樣就可以啟動異步類了 }
【後記】
小編盡可能的通過自己的理解和細致的模板讓Android愛好者看懂、看通,當然小編自己也是一個學習者,希望碼友們在學習的過程中發現問題、指正問題,我們共同學習,共同進步!
Android MeasuerSpce的由來及使用 含義:MeasuerSpce是parent傳遞給child的一組測量值(size)和模式(mode)的組合。 使用場景
基於HTML5的WebGL結合Box2DJS物理引擎應用上篇我們基於HT for Web呈現了A* Search Algorithm的3D尋路效果,這篇我們將采用HT f
Android百度地圖API集成三《搜索》,android《搜索》 書接上回↑ 一、基礎地圖界面地址:http://www.cnblogs.com/dhr125/p
僵屍進程的產生原因和避免方法僵屍進程的產生:當一個進程創建了一個子進程時,他們的運行時異步的。即父進程無法預知子進程會在什麼時候結束,那麼如果父進程很繁忙來不及wait