您好,登錄后才能下訂單哦!
上一篇博文講述了ANR異常以及使用handler類解決異常。這次我將給大家介紹另外一種處理耗時操作的方法。異步處理耗時操作是當時比較流行的方法,所以能完全掌握此類的使用是非常重要。至于為什么會流行,下面我就先給大家介紹使用AsyncTask的好處
1:使用AsyncTask的好處
當我們處理耗時操作時候,比如下載這時候我們就要啟動一個線程,假設我們有幾百條線程要啟動。我給大家舉個例子。線程啟動就像掃把,啟動一個就等于一把新掃把,當我們用完的時候就丟掉,等到下次再用的時候就在買一把新掃把,如此循環。這樣就等于浪費資源。而使用AsyncTask就想一個放10幾個掃把的地方。每次我們用了掃把后就放回去,等下次某個人需要用的時候繼續循環使用這個掃把,這樣以來就節省了系統資源。現在大家知道AsyncTask類的好處了吧,能節省系統資源對我們做好一個大項目來說是至關重要的。
2:AsyncTask的使用。
(1):我給大家做個例子,有一個進度條,一個文本,一個按鈕啟動下載,當點擊下載時候文本就會根本當前進度條進度顯示百分比的進度,如下圖
(2):寫一個內部類繼承AsyncTask,其實第一個方法是必須實現的,后面2個是我手動調用的,具體代碼如下
class MyTask extends AsyncTask<String, Integer, String> { @Override protected String doInString... params) { publishProgress(values); return null; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } @Override protected void onPostExecute(String result) { super.onPostExecute(result); } }
首先這個類需要有3個類型,第一個params類型就是等會我們啟動線程池需要傳入的參數類型,一般都是傳入網址,所以我定義它為String類型,當此類型定義完成后,doInBackgroud方法中的參數類型就是同樣是String類型(doInBackground方法想當于線程的run方法,是在子線程處理的)。它會獲得我們傳入的網址參數。第二個Progress類型就是我們在處理耗時操作過程中如果需要處理主線程的東西時候,就可以在doInBackground方法中調用publishProgress(values)方法激活第二個重寫的方法onProgressUpdate()方法(這個方法是在main線程中的執行的因此可以操作UI對象.values一般都是傳入進度參數。第三個參數就是當我們處理好了doInBackgroud的方法,他會返回一個結果,這個結果的類型,這里我給它定義為String,這時候doInBackgroud方法返回值自動變為String類型
然后第三個方法onPostExecute就會接受到doInBackgroud返回的結果值。
(3):在鑒定匿名類里面我們就啟動這個線程池,由于之前我定義了啟動線程池傳入的參數為String類型,所以現在我就傳入了一個String,代碼如下:(這里這個參數目前沒用只是為了說明前面的問題
new MyTask().execute("www.baidu.com");
(4):然后在doInBackgroud方法處理進度(這里設定每100毫秒增加一個進度然后調用publishProgress()方法來在主線程增加進度條進度和更新文本百分比進度),代碼如下
@Override protected String doInString... params) { //沒100毫秒進度+1,總共執行100次 for (int i = 0; i < 100; i++) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } //激活onProgressUpdate并將進度i傳入 publishProgress(i); } return "下載完成"; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); //更新進度條進度 mProgressBar.setProgress(values[0]); //更新百分比進度 mTextView.setText(values[0]+"%"); }
(4):當下載完成以后我們在onPostExecute()方法中將文本內容更新為下載完成
@Override protected void onPostExecute(String result) { super.onPostExecute(result); mTextView.setText(result); }
大功告成。這就是使用AsyncTask類實現異步耗時操作的用法,我會吧這次程序的完整代碼上傳到我的上傳,大家如果有需要的話可以去下載,下一次我會結合ListView和AsyncTask做一個下載歌曲的小項目
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。