国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

詳解Android 中AsyncTask 的使用

2019-10-22 18:28:48
字體:
來源:轉載
供稿:網友

詳解Android 中AsyncTask 的使用

1、首先我們來看看AsyncTask 的介紹:  

   Handler 和 AsyncTask 都是android 中用來實現異步任務處理的方式;其中:

    Handler 實例向 UI 線程發送消息,完成界面更新, 

        優點:對整個過程控制的比較精細;
        缺點:代碼相對臃腫,多個任務同時執行時,不易對線程進行精確的控制;

    AsyncTask :比Handler 更輕量級一些,適用于簡單的異步處理; 

        優點:簡單 | 快捷 | 過程可控;
        缺點:使用多個異步操作時就變得復雜起來;

2、AsyncTask 的定義:(AsyncTask 定義了三種泛型類型) 

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

    說明: 

        Params :啟動任務執行的輸入參數,例如:HTTP 請求的URL;
        Progress: 后臺任務執行的百分比;
        Result:后臺執行任務最終返回的結果,比如String;

3、AsyncTask 異步任務的執行步驟:(以下方法除execute(Params... params),在AsyncTask中重寫),下列是相關方法的介紹:

    A、execute(Params... params) : 

        執行一個異步任務,需要我們在UI線程中調用,觸發任務

    B、OnPreExecute(): 

        execute(Params... params)調用后立即執行,一般用于在執行后臺任務前對UI做一些標記; 例如,可以在此處顯示進度對話框;

    C、doInBackground(Params.. params): 

        onPreExecute() 完成后執行,后臺執行,處理比較耗時的操作;此處不能操作UI,執行的過程中調用publishProgress(Progress... values)來更新進度信息;

    D、onProgressUpdate(Progress... values): 

        在調用publicshProgress(Progress... values)方法執行,直接將進度信息更新到UI組建上;此方法在主線程上執行,用于顯示任務執行的進度;

    E、onPostExecute(Result result): 

        此方法在主線程中執行,當后臺的操作結束時,此方法會被調用,計算結果作為參數傳遞到此方法中,直接將結果顯示到UI組建上。

    F、cancel(); : 

        取消一個正在執行的任務,在UI線程中完成,用AsyncTask的對象進行調用,參數為true/false;

4、使用AsyncTask 時注意事項: 

    A、異步任務實例必須在UI線程中創建;
    B、execute(Params... params) 方法必須在UI線程中調用;
    C、不要手動的調onPreExecute().doInBackground().onProgressUpdate().onPostExecute()這幾個方法;
    D、不能在doInBackground(Params... params) 中更改組件信息;
    E、一個任務實例只能執行一次,如果執行第二次會拋出異常;

5、案例:使用AsyncTask 實現圖片的下載:

    Activity類,主程序的入口:

  public class MainActivity extends Activity {    // 程序入口   protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_main);     MyAsyncTask my = new MyAsyncTask();     my.execute("http://photocdn.sohu.com/20110927/Img320705637.jpg");   }  } 

   AsyncTask 派生類,實現異步任務:

  package com.sun.asynctask;  import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL;  import org.apache.http.HttpConnection; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient;  import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.util.Log;  /**  * 異步任務,實現網頁內容的獲取  *  *  * 生成該類的對象,并調用execute方法之后  *  * 首先執行的是onProExecute() 方法,  *  * 其次執行的doInBackground()方法  */ public class MyAsyncTask extends AsyncTask<String, Integer, Bitmap> {    /**    * 在execute() 方法執行后立即執行,運行在UI線程中,    * 在后臺任務開始前執行,用于標識UI界面    */   protected void onPreExecute() {     super.onPreExecute();     Log.i("msg","onPreExecute()...");   }    /**    * 后臺執行耗時的任務;    *    * 方法中的 String 參數對應 AsyncTask的第一個參數;    * 返回的 Bitmap 對應的是AsyncTask 的第三個參數;    *    * 該方法并不運行在UI線程中,主要用于異步操作,可以調用publishProgress()方法觸發    * onProgressUpdate對UI進行操作;    *    */   protected Bitmap doInBackground(String... params) {     Log.i("msg","doInBackground(String... params)...");      try {        /* 網絡訪問方式 二 */       /*       URL url = new URL(params[0]);       HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();       connection.connect(); // 開始連接       int zong = connection.getContentLength();       InputStream is2 = connection.getInputStream();       */        /* 開始網絡訪問數據 */       HttpGet hg = new HttpGet(params[0]); // 此處注意參數的用法       HttpClient hc = new DefaultHttpClient();       HttpResponse hr = hc.execute(hg); // 發送請求,得到響應        // 判斷請求是否成功       if(hr.getStatusLine().getStatusCode() == HttpStatus.SC_OK){         Log.i("msg", "access success...");         HttpEntity he = hr.getEntity();         InputStream is = he.getContent(); // 獲取輸入流對象,好比搭橋         long total = he.getContentLength(); // 文件的總字節數          ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 輸出流,臨時容器,用于裝從is中流出的數據          byte[] buffer = new byte[1024]; // 緩存容器,每次裝載1024 個字節數據         int len = 0; // 每次讀的字節數         int curLen = 0 ; // 已讀多少數據          while((len=is.read(buffer))!=-1){ // 當len !=-1 時,也就是還有數據可讀           Log.i("msg","begin read data..."+len+",total:"+total);           baos.write(buffer, 0, len); // 向臨時容器中裝數據           curLen=curLen+len; // 更新已讀的數據            /* 在UI顯示當前讀取的進度 , 調用次方法觸發onProgressUpdate() 方法執行 */           publishProgress((int)(((float)curLen/total)*100));         }          Bitmap bitmap = BitmapFactory.decodeByteArray(baos.toByteArray(), 0, (int)total);         is.close();         return bitmap;       }     } catch (Exception e) {       e.printStackTrace();     }      return null;   }    /**    * 括號中的參數:String 對應的是AsyncTask 的第三個參數,也就是    * 接收了 從doInBackground() 返回的結果;    * 此方法在 doInBackground() 方法執行結束后執行,運行在UI線程中,    * 可以對UI進行更新    */   protected void onPostExecute(Bitmap result) {     super.onPostExecute(result);     Log.i("msg","onPostExecute(String result)..."+result.getHeight());   }     /**    * 方法括號中的Integer 對應AsyncTask 中的第二個參數;    * 在doInBackground() 中每次調用publishProgress() 時被執行;    * 該方法是在UI線程中的,所以可以用于對UI進行更新    */   protected void onProgressUpdate(Integer... values) {     super.onProgressUpdate(values);      Log.i("msg","onProgressUpdate(Integer... values)..."+values[0]);   }     /**    * 圖片的下載    */   public HttpURLConnection downPic(String urltemp){      try {       URL url = new URL(urltemp); // 確定連接地址       // 打開一個連接       HttpURLConnection connection = (HttpURLConnection) url.openConnection();       connection.connect(); // 開始連接       return connection;     } catch (Exception e) {       e.printStackTrace();     }     return null;   }    } 

以上就是Android AsyncTask的應用實例,如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 中超| 重庆市| 呼图壁县| 马龙县| 娄烦县| 洪雅县| 民和| 三亚市| 鞍山市| 都匀市| 清丰县| 星子县| 昂仁县| 云梦县| 兴安盟| 卓尼县| 长宁区| 宜春市| 板桥市| 滨海县| 普安县| 泰来县| 通州市| 信阳市| 二手房| 若尔盖县| 柘城县| 盖州市| 霍城县| 华坪县| 灵宝市| 沂水县| 利辛县| 西宁市| 阜新| 开化县| 道真| 泽州县| 边坝县| 得荣县| 建始县|