AsyncTask 異步任務

1.  爲何要有異步任務?    android

① 若是在子線程操做一些耗時的操做容易形成卡頓spring

② android規定主線程中不能夠作http連接操做異步

2.爲何會有AsyncTaskide

① 子線程中更新UI       源碼分析

② 封裝,簡化異步操做url

3.構建AsyncTask子類的參數spa

AsyncTask<Params,Progress,Result>是一個抽象類,一般用於被繼承,有三個參數.net

Params :啓動任務時輸入參數的類型線程

Progress:後臺任務執行中返回進度值的類型code

Result:後臺執行任務完成後返回結果的類型

4.須要重寫的方法

doInBackground :須要重寫,異步執行後臺線程將要完成的任務

② onPreExecute:執行後臺耗時操做前被調用,一般用戶完成一些初始化操做

onPostExecute:當doInBackground()完成後,系統會自動調用onPostExecute(),並將doInBackground  方法返回的值傳給該方法

onProgressUpdate:在doInBackground()方法中調用publishProgress()方法,更新任務的執行進度後,  就會觸發該方法

 

5.使用時的注意事項

① 必須在UI線程中建立AsyncTask實例和調用execute方法

② 重寫的四個方法是系統自動調用的,不該該手動調用

③ 每一個AsyncTask只能被執行一次,多吃哦調用將會引起異常

    

AsyncTask請求圖片

private class MyAsyncTask extends AsyncTask<String, Integer, Bitmap> {


    private Bitmap bitmap;

    @Override
    protected Bitmap doInBackground(String... params) {
        //獲取傳遞進來的參數
        String url = params[0];
        try {
            URL url1 = new URL(url);
            URLConnection urlConnection = url1.openConnection();
            InputStream is = urlConnection.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            //經過decodeStream解析輸入流
            bitmap = BitmapFactory.decodeStream(bis);
            is.close();
            bis.close();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return bitmap;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        super.onPostExecute(bitmap);
        img.setImageBitmap(bitmap);
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);

    }
}

 

AsyncTask加載進度條

private class MyAsyncTask2 extends AsyncTask<Void, Integer, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        for (int i = 0; i < 100; i++) {
            if(isCancelled()){
                break;
            }
            publishProgress(i);
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        if(isCancelled()){
            return;
        }
        progressbar.setProgress(values[0]);
    }
}

 

源碼分析參考地址   

http://blog.csdn.net/iispring/article/details/50670388

 

深刻理解AsyncTask

This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.

意思是這個類使得:不使用Thread和Handler,就能夠在後臺執行操做而後在發佈結果到UI線程。其實他內部的實現就是封裝了Thread和Handler,因此你就沒必要要直接用這兩個低層類了,但他的目的也是代碼複用,他的實現跟咱們上面寫的類也差很少。主要有這幾點不一樣:1、AsyncTask使用了線程池而不是單個線程去執行後臺任務,該線程池是整個進程共用的,是由於他的線程池對象是一個靜態成員變量,這一點不少人搞錯,誤覺得AsyncTask越多建立的線程越多,這不是絕對正確的,由於線程池會根據負載動態調整的,並且有最大值和空閒超時,AsyncTask的配置是最小5,最大128,空閒超時1秒,固然你也能夠配置成線程數根據任務數線程遞增;2、AsyncTask的輸入和輸出參數使用了泛型;3、AsyncTask支持中斷當前任務。

相關文章
相關標籤/搜索