文檔翻譯:
AsyncTask
能夠適當地、簡單地用於
UI線程。這個類准許執行後台操作,讓那些沒有熟練操作線程的操作者在
UI線程上發布結果。
非同步任務的定義是一個在後台線程上運行,其結果是在
UI線程上發表的計算。
非同步任務被定義成三種一般類型:
Params,
Progress和
Result;四步:
begin
, doInBackground
, processProgress
和end.
用法:
AysncTask必須被繼承成子集應用。子類至少
override一個方法
(doInBackground(Params...)),最多經常
override另一個
(onPostExecute(Result))。
子類例子:
- private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
- protected Long doInBackground(URL... urls) {
- int count = urls.length;
- long totalSize = 0;
- for (int i = 0; i < count; i++) {
- totalSize += Downloader.downloadFile(urls[i]);
- publishProgress((int) ((i / (float) count) * 100));
- }
- return totalSize;
- }
- protected void onProgressUpdate(Integer... progress) {
- setProgressPercent(progress[0]);
- }
- protected void onPostExecute(Long result) {
- showDialog("Downloaded " + result + " bytes");
- }
- }
複製代碼
一旦建立,一個任務執行起來就非常簡單:
- new DownloadFilesTask().execute(url1, url2, url3);
複製代碼
AsyncTask
的一般類型
:
這三個類型被用於一個非同步任務,如下:
1.Params,當執行時,參數類型發送到任務
2.Progress,在後台計算期間,線程單位類型被發布
3.Result,後台計算的結果類型
在一個非同步任務裡,不是所有的類型總被用。假如一個類型不被使用,可以簡單地適用
Void類型:
- 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...)
*任務會執行僅一次(假如有第二個嘗試去執行,將拋出一個異常)
下面上一執行個體(程式
啟動的初始化進度條):
項目結構():
- public class Double extends Activity {
- public ProgressBar pBar;
- /** Called when the activity is first created. */
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- pBar = (ProgressBar) findViewById(R.id.progress_bar);
- //線程規則二:execute(Params...)必須在UI線程上調用
- new AsyncLoader().execute((Void)null);
- }
- public void initProgress() {
- pBar.setProgress(0);
- //這裡可以做一些初始化工作,我就不麻煩寫了,寫幾個變態的for迴圈算了
- for (int i = 0; i < 100; i++) {
- System.out.println("***********" + i + "*************");
- }
- pBar.setProgress(30);
- //這裡可以做一些初始化工作,我就不麻煩寫了,寫幾個變態的for迴圈算了
- for (int i = 0; i < 100; i++) {
- System.out.println("***********" + i + "*************");
- }
- pBar.setProgress(60);
- //這裡可以做一些初始化工作,我就不麻煩寫了,寫幾個變態的for迴圈算了
- for (int i = 0; i < 100; i++) {
- System.out.println("***********" + i + "*************");
- }
- pBar.setProgress(100);
- Intent intent = new Intent(Double.this, Double2.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- startActivity(intent);
- finish();
- }
-
- //繼承於AsyncTask
- class AsyncLoader extends AsyncTask<Void, Void, Integer>{
- @Override
- protected Integer doInBackground(Void... params) {
- initProgress();
- return null;
- }
-
- }
- }
http://www.javaeye.com/topic/507442