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

首頁(yè) > 系統(tǒng) > Android > 正文

詳解Android 中AsyncTask 的使用

2019-12-12 02:07:07
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

詳解Android 中AsyncTask 的使用

1、首先我們來(lái)看看AsyncTask 的介紹:  

   Handler 和 AsyncTask 都是android 中用來(lái)實(shí)現(xiàn)異步任務(wù)處理的方式;其中:

    Handler 實(shí)例向 UI 線(xiàn)程發(fā)送消息,完成界面更新, 

        優(yōu)點(diǎn):對(duì)整個(gè)過(guò)程控制的比較精細(xì);
        缺點(diǎn):代碼相對(duì)臃腫,多個(gè)任務(wù)同時(shí)執(zhí)行時(shí),不易對(duì)線(xiàn)程進(jìn)行精確的控制;

    AsyncTask :比Handler 更輕量級(jí)一些,適用于簡(jiǎn)單的異步處理; 

        優(yōu)點(diǎn):簡(jiǎn)單 | 快捷 | 過(guò)程可控;
        缺點(diǎn):使用多個(gè)異步操作時(shí)就變得復(fù)雜起來(lái);

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

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

    說(shuō)明: 

        Params :?jiǎn)?dòng)任務(wù)執(zhí)行的輸入?yún)?shù),例如:HTTP 請(qǐng)求的URL;
        Progress: 后臺(tái)任務(wù)執(zhí)行的百分比;
        Result:后臺(tái)執(zhí)行任務(wù)最終返回的結(jié)果,比如String;

3、AsyncTask 異步任務(wù)的執(zhí)行步驟:(以下方法除execute(Params... params),在AsyncTask中重寫(xiě)),下列是相關(guān)方法的介紹:

    A、execute(Params... params) : 

        執(zhí)行一個(gè)異步任務(wù),需要我們?cè)赨I線(xiàn)程中調(diào)用,觸發(fā)任務(wù)

    B、OnPreExecute(): 

        execute(Params... params)調(diào)用后立即執(zhí)行,一般用于在執(zhí)行后臺(tái)任務(wù)前對(duì)UI做一些標(biāo)記; 例如,可以在此處顯示進(jìn)度對(duì)話(huà)框;

    C、doInBackground(Params.. params): 

        onPreExecute() 完成后執(zhí)行,后臺(tái)執(zhí)行,處理比較耗時(shí)的操作;此處不能操作UI,執(zhí)行的過(guò)程中調(diào)用publishProgress(Progress... values)來(lái)更新進(jìn)度信息;

    D、onProgressUpdate(Progress... values): 

        在調(diào)用publicshProgress(Progress... values)方法執(zhí)行,直接將進(jìn)度信息更新到UI組建上;此方法在主線(xiàn)程上執(zhí)行,用于顯示任務(wù)執(zhí)行的進(jìn)度;

    E、onPostExecute(Result result): 

        此方法在主線(xiàn)程中執(zhí)行,當(dāng)后臺(tái)的操作結(jié)束時(shí),此方法會(huì)被調(diào)用,計(jì)算結(jié)果作為參數(shù)傳遞到此方法中,直接將結(jié)果顯示到UI組建上。

    F、cancel(); : 

        取消一個(gè)正在執(zhí)行的任務(wù),在UI線(xiàn)程中完成,用AsyncTask的對(duì)象進(jìn)行調(diào)用,參數(shù)為true/false;

4、使用AsyncTask 時(shí)注意事項(xiàng): 

    A、異步任務(wù)實(shí)例必須在UI線(xiàn)程中創(chuàng)建;
    B、execute(Params... params) 方法必須在UI線(xiàn)程中調(diào)用;
    C、不要手動(dòng)的調(diào)onPreExecute().doInBackground().onProgressUpdate().onPostExecute()這幾個(gè)方法;
    D、不能在doInBackground(Params... params) 中更改組件信息;
    E、一個(gè)任務(wù)實(shí)例只能執(zhí)行一次,如果執(zhí)行第二次會(huì)拋出異常;

5、案例:使用AsyncTask 實(shí)現(xiàn)圖片的下載:

    Activity類(lèi),主程序的入口:

  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 派生類(lèi),實(shí)現(xiàn)異步任務(wù):

  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;  /**  * 異步任務(wù),實(shí)現(xiàn)網(wǎng)頁(yè)內(nèi)容的獲取  *  *  * 生成該類(lèi)的對(duì)象,并調(diào)用execute方法之后  *  * 首先執(zhí)行的是onProExecute() 方法,  *  * 其次執(zhí)行的doInBackground()方法  */ public class MyAsyncTask extends AsyncTask<String, Integer, Bitmap> {    /**    * 在execute() 方法執(zhí)行后立即執(zhí)行,運(yùn)行在UI線(xiàn)程中,    * 在后臺(tái)任務(wù)開(kāi)始前執(zhí)行,用于標(biāo)識(shí)UI界面    */   protected void onPreExecute() {     super.onPreExecute();     Log.i("msg","onPreExecute()...");   }    /**    * 后臺(tái)執(zhí)行耗時(shí)的任務(wù);    *    * 方法中的 String 參數(shù)對(duì)應(yīng) AsyncTask的第一個(gè)參數(shù);    * 返回的 Bitmap 對(duì)應(yīng)的是AsyncTask 的第三個(gè)參數(shù);    *    * 該方法并不運(yùn)行在UI線(xiàn)程中,主要用于異步操作,可以調(diào)用publishProgress()方法觸發(fā)    * onProgressUpdate對(duì)UI進(jìn)行操作;    *    */   protected Bitmap doInBackground(String... params) {     Log.i("msg","doInBackground(String... params)...");      try {        /* 網(wǎng)絡(luò)訪問(wèn)方式 二 */       /*       URL url = new URL(params[0]);       HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();       connection.connect(); // 開(kāi)始連接       int zong = connection.getContentLength();       InputStream is2 = connection.getInputStream();       */        /* 開(kāi)始網(wǎng)絡(luò)訪問(wèn)數(shù)據(jù) */       HttpGet hg = new HttpGet(params[0]); // 此處注意參數(shù)的用法       HttpClient hc = new DefaultHttpClient();       HttpResponse hr = hc.execute(hg); // 發(fā)送請(qǐng)求,得到響應(yīng)        // 判斷請(qǐng)求是否成功       if(hr.getStatusLine().getStatusCode() == HttpStatus.SC_OK){         Log.i("msg", "access success...");         HttpEntity he = hr.getEntity();         InputStream is = he.getContent(); // 獲取輸入流對(duì)象,好比搭橋         long total = he.getContentLength(); // 文件的總字節(jié)數(shù)          ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 輸出流,臨時(shí)容器,用于裝從is中流出的數(shù)據(jù)          byte[] buffer = new byte[1024]; // 緩存容器,每次裝載1024 個(gè)字節(jié)數(shù)據(jù)         int len = 0; // 每次讀的字節(jié)數(shù)         int curLen = 0 ; // 已讀多少數(shù)據(jù)          while((len=is.read(buffer))!=-1){ // 當(dāng)len !=-1 時(shí),也就是還有數(shù)據(jù)可讀           Log.i("msg","begin read data..."+len+",total:"+total);           baos.write(buffer, 0, len); // 向臨時(shí)容器中裝數(shù)據(jù)           curLen=curLen+len; // 更新已讀的數(shù)據(jù)            /* 在UI顯示當(dāng)前讀取的進(jìn)度 , 調(diào)用次方法觸發(fā)onProgressUpdate() 方法執(zhí)行 */           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;   }    /**    * 括號(hào)中的參數(shù):String 對(duì)應(yīng)的是AsyncTask 的第三個(gè)參數(shù),也就是    * 接收了 從doInBackground() 返回的結(jié)果;    * 此方法在 doInBackground() 方法執(zhí)行結(jié)束后執(zhí)行,運(yùn)行在UI線(xiàn)程中,    * 可以對(duì)UI進(jìn)行更新    */   protected void onPostExecute(Bitmap result) {     super.onPostExecute(result);     Log.i("msg","onPostExecute(String result)..."+result.getHeight());   }     /**    * 方法括號(hào)中的Integer 對(duì)應(yīng)AsyncTask 中的第二個(gè)參數(shù);    * 在doInBackground() 中每次調(diào)用publishProgress() 時(shí)被執(zhí)行;    * 該方法是在UI線(xiàn)程中的,所以可以用于對(duì)UI進(jìn)行更新    */   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); // 確定連接地址       // 打開(kāi)一個(gè)連接       HttpURLConnection connection = (HttpURLConnection) url.openConnection();       connection.connect(); // 開(kāi)始連接       return connection;     } catch (Exception e) {       e.printStackTrace();     }     return null;   }    } 

以上就是Android AsyncTask的應(yīng)用實(shí)例,如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 新田县| 漾濞| 宜良县| 临武县| 墨江| 九寨沟县| 周至县| 临澧县| 浑源县| 搜索| 登封市| 朝阳市| 咸宁市| 汾阳市| 阜阳市| 车险| 三原县| 黔西| 土默特左旗| 荣成市| 民县| 东台市| 丰台区| 泸西县| 景德镇市| 浦东新区| 沂南县| 尼玛县| 孟津县| 兴安县| 阿拉善左旗| 吉木乃县| 全州县| 浏阳市| 麟游县| 二手房| 梅河口市| 巴林左旗| 周宁县| 论坛| 淮阳县|