Android–AsyncTask執行個體

來源:互聯網
上載者:User

文檔翻譯:

 

AsyncTask
能夠適當地、簡單地用於
UI線程。這個類准許執行後台操作,讓那些沒有熟練操作線程的操作者在
UI線程上發布結果。

非同步任務的定義是一個在後台線程上運行,其結果是在
UI線程上發表的計算。

非同步任務被定義成三種一般類型:
Params,
Progress和
Result;四步:
begin
, doInBackground
, processProgress
和end.

 

用法:

AysncTask必須被繼承成子集應用。子類至少
override一個方法
(doInBackground(Params...)),最多經常
override另一個
(onPostExecute(Result))。

 

子類例子:

  1. private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {     
  2.                    protected Long doInBackground(URL... urls) {         
  3.                              int count = urls.length;         
  4.                              long totalSize = 0;         
  5.                              for (int i = 0; i < count; i++) {            
  6.                                        totalSize += Downloader.downloadFile(urls[i]);            
  7.                                        publishProgress((int) ((i / (float) count) * 100));         
  8.                              }         
  9.                              return totalSize;     
  10.                    }      
  11.                    protected void onProgressUpdate(Integer... progress) {         
  12.                              setProgressPercent(progress[0]);     
  13.                    }      
  14.                    protected void onPostExecute(Long result) {         
  15.                              showDialog("Downloaded " + result + " bytes");     
  16.                    }
  17. }

複製代碼

一旦建立,一個任務執行起來就非常簡單:

  1. new DownloadFilesTask().execute(url1, url2, url3);

複製代碼

AsyncTask
的一般類型

:


這三個類型被用於一個非同步任務,如下:

1.Params,當執行時,參數類型發送到任務

2.Progress,在後台計算期間,線程單位類型被發布

3.Result,後台計算的結果類型

 

在一個非同步任務裡,不是所有的類型總被用。假如一個類型不被使用,可以簡單地適用
Void類型:

  1. private class MyTask extends AsyncTask

複製代碼

四步曲:



當一個非同步任務被執行,這個任務要完成四步:

1.onPreExecute(),任務被執行之後,立刻調用
UI線程。這步通常被用於設定任務,例如在使用者介面顯示一個進度條。

2.doInBackground(Params...), onPreExecute()完成執行,立刻調用後台線程,這步被用於執行較長時間的後台計算。非同步任務的參數也被傳到這步。計算的結果必須在這步返回,將傳回到上一步。

3.onProgressUpdate(Progress...),一次呼叫
publishProgress(Progress...)後調用
UI線程,執行的時機沒有定義。這個方法用於在使用者介面顯示進度,當後台計算還在進行時。例如:這個方法可以被用於一個進度條動畫或在文本域顯示日誌。

4.onPostExecute(Result), 當後台計算結束時,調用
UI線程。後台計算結果作為一個參數傳遞到這步。

 

線程規則:

 

有一些線程規則必須去遵守,這個類才會正確的工作:

*任務執行個體
必須建立在
UI線程

* execute(Params...)必須在
UI線程上調用

*不要手動調用
onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...)

*任務會執行僅一次(假如有第二個嘗試去執行,將拋出一個異常)

 

下面上一執行個體(程式
啟動的初始化進度條):

 

項目結構():


  1. public class Double extends Activity {
  2.     public ProgressBar pBar;
  3.     /** Called when the activity is first created. */
  4.     @Override
  5.     protected void onCreate(Bundle savedInstanceState) {
  6.         super.onCreate(savedInstanceState);
  7.         setContentView(R.layout.main);
  8.         pBar = (ProgressBar) findViewById(R.id.progress_bar);
  9.         //線程規則二:execute(Params...)必須在UI線程上調用
  10.         new AsyncLoader().execute((Void)null);
  11.     }
  12.     public void initProgress() {
  13.         pBar.setProgress(0);
  14.         //這裡可以做一些初始化工作,我就不麻煩寫了,寫幾個變態的for迴圈算了
  15.         for (int i = 0; i < 100; i++) {
  16.             System.out.println("***********" + i + "*************");
  17.         }
  18.         pBar.setProgress(30);
  19.         //這裡可以做一些初始化工作,我就不麻煩寫了,寫幾個變態的for迴圈算了
  20.         for (int i = 0; i < 100; i++) {
  21.             System.out.println("***********" + i + "*************");
  22.         }
  23.         pBar.setProgress(60);
  24.         //這裡可以做一些初始化工作,我就不麻煩寫了,寫幾個變態的for迴圈算了
  25.         for (int i = 0; i < 100; i++) {
  26.             System.out.println("***********" + i + "*************");
  27.         }
  28.         pBar.setProgress(100);
  29.         Intent intent = new Intent(Double.this, Double2.class);
  30.         intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  31.         startActivity(intent);
  32.         finish();
  33.     }
  34.    
  35.     //繼承於AsyncTask
  36.     class AsyncLoader extends AsyncTask<Void, Void, Integer>{
  37.         @Override
  38.         protected Integer doInBackground(Void... params) {
  39.             initProgress();
  40.             return null;
  41.         }
  42.         
  43.     }
  44. }

http://www.javaeye.com/topic/507442

聯繫我們

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