天天看點

Android 異步任務:AsyncTask

一、異步任務介紹

 多線程程式設計Handler重新整理UI界面​這是我們之前學習的一種利用多線程的方式,通過子線程向主線程發送消息的方式實作的UI界面的重新整理,實際上為解決UI的界面重新整理問題,Android提供了好幾種方案比如:View.post、View.postDelayed、Activity.runOnUiThread。但是上面的方法都比較麻煩,而異步任務(AsyncTask)作為Handler的封裝類,正好可以簡化這種操作。 

 異步任務的實作原理也是基于異步消息處理機制的,就是我們在多線程程式設計Handler中所介紹的Message、MessageQueue、Handler、Looper。

二、Async的參數和方法

1、參數

AsyncTask是一個抽象類,我們需要一個class去繼承,下面我們來看下傳遞參數。

class Async extends AsyncTask<Params, Progress, Result>{}      

1、Params:啟動任務執行傳入參數的類型(用于doInBackground()(背景任務)的參數)

2、Progress:背景任務執行時,如果需要在界面上顯示目前的進度,則使用這裡指定的泛型作為進度機關。(泛型不能使用簡單資料類型)

3、Result:當任務執行完畢後如果需要對結果執行傳回,傳回的就是這個類型的參數

2、方法

1、onPreExcute():該方法在背景任務開始執行之前調用該方法,可以用于初始化界面。

1、doInBackground(Params…):這個方法的所有代碼都會在子線程中運作,我們應該在這裡處理所有的耗時任務。任務一旦完成可以通過return語句來将任務的執行結果傳回。注意:在這個方法裡不可以進行更新UI的操作,如果需要更新UI元素,可以調用publishProgress(progress)。

2、onProgressUpdate(Progress…values):當在背景任務中調用了publishProgress(progress)方法之後,這個方法很快就會被調用,方法中攜帶的參數就是背景運作傳遞過來的。

3、onPostExecute(Result…values):當任務執行完畢并通過return語句進行傳回時,就會調用這個方法。可以利用一些傳回資料進行更新UI。

三、使用範例

使用步驟

1、寫一個繼承AsyncTask的class

2、在該class中通過onProgressUpdate重新整理界面

3、在Activity中調用通過new AsyncTask().execute();

思路

代碼

package com.example.myasynctask;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;

public class MainActivity extends Activity
   private Button mbtn_start;
   private ProgressBar mprogressbar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mbtn_start=(Button) findViewById(R.id.mbtn);
        mprogressbar=(ProgressBar) findViewById(R.id.progressbar);
        mbtn_start.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                MyTask mytask=new MyTask();
                mytask.execute();

            }
        });
    }
    class MyTask extends AsyncTask<Integer, Integer, String>{

        protected String doInBackground(Integer... params) {
        int count=0;
        while(count<101){
            count++;
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            publishProgress(count);//更新UI界面
        }
            return "已經完成";
        }

        @Override
        protected void onPostExecute(String result) {           
            super.onPostExecute(result);
            mbtn_start.setText(result);
        }
        @Override
        protected void onProgressUpdate(Integer... values) {            
//          int count=Integer.parseInt(values[0]);
//          mprogressbar.setProgress(count);
            int count=values[0];
            mprogressbar.setProgress(count);
            super.onProgressUpdate(values);
        }
    }
}      

效果