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支持中斷當前任務。