AsyncTask的基本使用

public abstract class AsyncTask<Params, Progress, Result> {  }

三種泛型類型分別代表“啓動任務執行的輸入參數”、“後臺任務執行的進度”、“後臺計算結果的類型”。在特定場合下,並不是所有類型都被使用,如果沒有被使用,可以用java.lang.Void類型代替。


二、一個異步任務的執行一般包括以下幾個步驟:


1.execute(Params... params),執行一個異步任務,需要我們在代碼中調用此方法,觸發異步任務的執行。


2.onPreExecute(),在execute(Params... params)被調用後立即執行,一般用來在執行後臺任務前對UI做一些標記。


3.doInBackground(Params... params),在onPreExecute()完成後立即執行,用於執行較爲費時的操作,此方法將接收輸入參數和返回計算結果。在執行過程中可以調用publishProgress(Progress... values)來更新進度信息。


4.onProgressUpdate(Progress... values),在調用publishProgress(Progress... values)時,此方法被執行,直接將進度信息更新到UI組件上。


5.onPostExecute(Result result),當後臺操作結束時,此方法將會被調用,計算結果將做爲參數傳遞到此方法中,直接將結果顯示到UI組件上。


三、需要注意的幾點:


1.異步任務的實例必須在UI線程中創建。


2.execute(Params... params)方法必須在UI線程中調用。


3.不要手動調用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)這幾個方法。


4.不能在doInBackground(Params... params)中更改UI組件的信息。


5.一個任務實例只能執行一次,如果執行第二次將會拋出異常。


請看下面的demo:

public class MainActivity extends Activity {  
  
    private static final String TAG = "ASYNC_TASK";  
  
    private Button execute;  
    private Button cancel;  
    private ProgressBar progressBar;  
    private TextView textView;  
  
    private MyTask mTask;  
  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
  
        execute = (Button) findViewById(R.id.execute);  
        execute.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                //注意每次需new一個實例,新建的任務只能執行一次,否則會出現異常  
                mTask = new MyTask();  
                mTask.execute("http://www.baidu.com");  
  
                execute.setEnabled(false);  
                cancel.setEnabled(true);  
            }  
        });  
        cancel = (Button) findViewById(R.id.cancel);  
        cancel.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                //取消一個正在執行的任務,onCancelled方法將會被調用  
                mTask.cancel(true);  
            }  
        });  
        progressBar = (ProgressBar) findViewById(R.id.progress_bar);  
        textView = (TextView) findViewById(R.id.text_view);  
  
    }  
  
    private class MyTask extends AsyncTask<String, Integer, String> {  
        //onPreExecute方法用於在執行後臺任務前做一些UI操作  
        @Override  
        protected void onPreExecute() {  
            Log.i(TAG, "onPreExecute() called");  
            textView.setText("loading...");  
        }  
  
        //doInBackground方法內部執行後臺任務,不可在此方法內修改UI  
        @Override  
        protected String doInBackground(String... params) {  
            Log.i(TAG, "doInBackground(Params... params) called");  
            try {  
                HttpClient client = new DefaultHttpClient();  
                HttpGet get = new HttpGet(params[0]);  
                HttpResponse response = client.execute(get);  
                if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {  
                    HttpEntity entity = response.getEntity();  
                    InputStream is = entity.getContent();  
                    long total = entity.getContentLength();  
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();  
                    byte[] buf = new byte[1024];  
                    int count = 0;  
                    int length = -1;  
                    while ((length = is.read(buf)) != -1) {  
                        baos.write(buf, 0, length);  
                        count += length;  
                        //調用publishProgress公佈進度,最後onProgressUpdate方法將被執行  
                        publishProgress((int) ((count / (float) total) * 100));  
                        //爲了演示進度,休眠500毫秒  
                        Thread.sleep(500);  
                    }  
                    return new String(baos.toByteArray(), "gb2312");  
                }  
            } catch (Exception e) {  
                Log.e(TAG, e.getMessage());  
            }  
            return null;  
        }  
  
        //onProgressUpdate方法用於更新進度信息  
        @Override  
        protected void onProgressUpdate(Integer... progresses) {  
            Log.i(TAG, "onProgressUpdate(Progress... progresses) called");  
            progressBar.setProgress(progresses[0]);  
            textView.setText("loading..." + progresses[0] + "%");  
        }  
  
        //onPostExecute方法用於在執行完後臺任務後更新UI,顯示結果  
        @Override  
        protected void onPostExecute(String result) {  
            Log.i(TAG, "onPostExecute(Result result) called");  
            textView.setText(result);  
  
            execute.setEnabled(true);  
            cancel.setEnabled(false);  
        }  
  
        //onCancelled方法用於在取消執行中的任務時更改UI  
        @Override  
        protected void onCancelled() {  
            Log.i(TAG, "onCancelled() called");  
            textView.setText("cancelled");  
            progressBar.setProgress(0);  
  
            execute.setEnabled(true);  
            cancel.setEnabled(false);  
        }  
    }  
} 



發佈了38 篇原創文章 · 獲贊 18 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章