AsyncTask非同步方式詳解及其使用

來源:互聯網
上載者:User

在實際應用中經常會遇到比較耗時任務的處理,比如網路連接,資料庫操作等情況時,如果這些操作都是放在主線程(UI線程)中,則會造成UI的假死現象,Android中可以使用AsyncTask和Handler兩種非同步方式來解決這種問題。Handler非同步方式詳解及其使用

AsyncTask(非同步任務處理)
在使用AsyncTask時處理類需要繼承AsyncTask,提供三個泛型參數,並且重載AsyncTask的四個方法(至少重載一個)。

 

三個泛型參數:
1.Param 任務執行器需要的資料類型
2.Progress 後台計算中使用的進度單位元據類型
3.Result 後台計算返回結果的資料類型
在設定參數時通常是這樣的:String... params,這表示方法可以有0個或多個此型別參數;有時參數可以設定為不使用,用Void...即可。

 

四個方法:
1.onPreExecute() 執行預先處理,它運行於UI線程,可以為背景工作做一些準備工作,比如繪製一個進度條控制項。
2.doInBackground(Params...) 後台進程執行的具體計算在這裡實現,doInBackground(Params...)是AsyncTask的關鍵,此方法必須重載。在這個方法內可以使用publishProgress(Progress...)改變當前的進度值。
3.onProgressUpdate(Progress...) 運行於UI線程。如果在doInBackground(Params...) 中使用了publishProgress(Progress...),就會觸發這個方法。在這裡可以對進度條控制項根據進度值做出具體的響應。
4.onPostExecute(Result) 運行於UI線程,可以對背景工作的結果做出處理,結果就是doInBackground(Params...)的傳回值。此方法也要經常重載,如果Result為null表明背景工作沒有完成(被取消或者出現異常)。

 

範例程式碼如下,完整代碼點這裡下載。

// AsyncTask非同步方式下載圖片<br />class DownImageTask extends AsyncTask<String, Integer, Bitmap> {<br />// 執行預先處理<br />@Override<br />protected void onPreExecute() {<br />super.onPreExecute();<br />// 顯示進度條<br />progressBar.setVisibility(View.VISIBLE);<br />progressBar.setMax(100);<br />}<br />// 後台進程的執行<br />@Override<br />protected Bitmap doInBackground(String... params) {<br />try {<br />URL url = new URL(params[0]);<br />HttpURLConnection conn = (HttpURLConnection) url<br />.openConnection();<br />InputStream inputStream = conn.getInputStream();<br />bitmap = BitmapFactory.decodeStream(inputStream);<br />// 進度條的更新,我這邊只是用一個迴圈來示範,在實際應用中要使用已下載檔案的大小和檔案總大小的比例來更新<br />for (int i = 1; i <= 10; i++) {<br />publishProgress(i * 10);<br />Thread.sleep(200);<br />}<br />inputStream.close();<br />} catch (Exception e) {<br />e.printStackTrace();<br />}<br />return bitmap;<br />}<br />// 運行於UI線程,對背景工作的結果做出處理,doInBackground方法執行的結果作為此方法的參數<br />@Override<br />protected void onPostExecute(Bitmap result) {<br />super.onPostExecute(result);<br />ImageView imageView = (ImageView) findViewById(R.id.image);<br />imageView.setImageBitmap(result);<br />progressBar.setVisibility(View.GONE);<br />}<br />// 運行於UI線程,如果在doInBackground(Params...)中使用了publishProgress(Progress...),就會觸發此方法<br />@Override<br />protected void onProgressUpdate(Integer... values) {<br />super.onProgressUpdate(values);<br />progressBar.setProgress(values[0]);<br />}<br />}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.