最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android中AsyncTask的用法實例分享

 更新時間:2014年02月24日 17:35:42   作者:  
AsyncTask的特點是任務(wù)在主線程之外運行,而回調(diào)方法是在主線程中執(zhí)行, 這就有效地避免了使用Handler帶來的麻煩

*  AsyncTask

        看上去修改后的connect()方法已經(jīng)可用了,但是這種匿名線程的方式是存在缺陷的:第一,線程的開銷較大,如果每個任務(wù)都要創(chuàng)建一個線程,那么應(yīng)用 程序的效率要低很多;第二,線程無法管理,匿名線程創(chuàng)建并啟動后就不受程序的控制了,如果有很多個請求發(fā)送,那么就會啟動非常多的線程,系統(tǒng)將不堪重負。 另外,前面已經(jīng)看到,在新線程中更新UI還必須要引入handler,這讓代碼看上去非常臃腫。

        為了解決這一問題,OPhone在1.5版本引入了AsyncTask。AsyncTask的特點是任務(wù)在主線程之外運行,而回調(diào)方法是在主線程中執(zhí)行, 這就有效地避免了使用Handler帶來的麻煩。閱讀AsyncTask的源碼可知,AsyncTask是使用java.util.concurrent 框架來管理線程以及任務(wù)的執(zhí)行的,concurrent框架是一個非常成熟,高效的框架,經(jīng)過了嚴格的測試。這說明AsyncTask的設(shè)計很好的解決了 匿名線程存在的問題。

      AsyncTask是抽象類,子類必須實現(xiàn)抽象方法doInBackground(Params... p) ,在此方法中實現(xiàn)任務(wù)的執(zhí)行工作,比如連接網(wǎng)絡(luò)獲取數(shù)據(jù)等。通常還應(yīng)該實現(xiàn)onPostExecute(Result r)方法,因為應(yīng)用程序關(guān)心的結(jié)果在此方法中返回。需要注意的是AsyncTask一定要在主線程中創(chuàng)建實例。AsyncTask定義了三種泛型類型 Params,Progress和Result。

    * Params 啟動任務(wù)執(zhí)行的輸入?yún)?shù),比如HTTP請求的URL。
    * Progress 后臺任務(wù)執(zhí)行的百分比。
    * Result 后臺執(zhí)行任務(wù)最終返回的結(jié)果,比如String。

      AsyncTask 的執(zhí)行分為四個步驟,與前面定義的TaskListener類似。每一步都對應(yīng)一個回調(diào)方法,需要注意的是這些方法不應(yīng)該由應(yīng)用程序調(diào)用,開發(fā)者需要做的就是實現(xiàn)這些方法。在任務(wù)的執(zhí)行過程中,這些方法被自動調(diào)用。

    * onPreExecute() 當任務(wù)執(zhí)行之前開始調(diào)用此方法,可以在這里顯示進度對話框。
    * doInBackground(Params...) 此方法在后臺線程執(zhí)行,完成任務(wù)的主要工作,通常需要較長的時間。在執(zhí)行過程中可以調(diào)用publicProgress(Progress...)來更新任務(wù)的進度。
    * onProgressUpdate(Progress...) 此方法在主線程執(zhí)行,用于顯示任務(wù)執(zhí)行的進度。
    * onPostExecute(Result) 此方法在主線程執(zhí)行,任務(wù)執(zhí)行的結(jié)果作為此方法的參數(shù)返回。

      PageTask擴展了AsyncTask,在 doInBackground()方法中讀取網(wǎng)頁內(nèi)容。PageTask的源代碼如下所示:

復(fù)制代碼 代碼如下:

// 設(shè)置三種類型參數(shù)分別為String,Integer,String 
    class PageTask extends AsyncTask<String, Integer, String> { 

        // 可變長的輸入?yún)?shù),與AsyncTask.exucute()對應(yīng) 
        @Override 
        protected String doInBackground(String... params) { 
            try { 
                HttpClient client = new DefaultHttpClient(); 
                // params[0] 代表連接的url 
                HttpGet get = new HttpGet(params[0]); 
                HttpResponse response = client.execute(get); 
                HttpEntity entity = response.getEntity(); 
                long length = entity.getContentLength(); 
                InputStream is = entity.getContent(); 
                String s = null; 
                if (is != null) { 
                    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
                    byte[] buf = new byte[128]; 
                    int ch = -1; 
                    int count = 0; 
                    while ((ch = is.read(buf)) != -1) { 
                        baos.write(buf, 0, ch); 
                        count += ch; 
                        if (length > 0) { 
                            // 如果知道響應(yīng)的長度,調(diào)用publishProgress()更新進度 
                            publishProgress((int) ((count / (float) length) * 100)); 
                        } 
                        // 為了在模擬器中清楚地看到進度,讓線程休眠100ms 
                        Thread.sleep(100); 
                    } 
                    s = new String(baos.toByteArray());            } 
                // 返回結(jié)果 
                return s; 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } 
            return null; 
        } 
        @Override 
        protected void onCancelled() { 
            super.onCancelled(); 
        } 
        @Override 
        protected void onPostExecute(String result) { 
            // 返回HTML頁面的內(nèi)容 
            message.setText(result); 
        } 
        @Override 
        protected void onPreExecute() { 
            // 任務(wù)啟動,可以在這里顯示一個對話框,這里簡單處理 
            message.setText(R.string.task_started); 
        } 
        @Override 
        protected void onProgressUpdate(Integer... values) { 
            // 更新進度 
            message.setText(values[0]); 
        } 
    }

執(zhí)行PageTask非常簡單,只需要調(diào)用如下代碼。重新運行NetworkActivity,不但可以抓取網(wǎng)頁的內(nèi)容,還可以實時更新讀取的進度。讀者嘗試讀取一個較大的網(wǎng)頁,看看百分比的更新情況。

復(fù)制代碼 代碼如下:

PageTask task = new PageTask(); 
task.execute(url.getText().toString());

下載實例: testAsync(jb51.net).rar

相關(guān)文章

  • 基于Android實現(xiàn)顏色漸變動畫效果

    基于Android實現(xiàn)顏色漸變動畫效果

    本文主要給大家介紹了Android實現(xiàn)顏色漸變動畫效果,實現(xiàn)這樣的一個動畫漸變的效果很簡單,只需要兩步,第一步用GradientDrawable實現(xiàn)兩個顏色之間的漸變效果,第二步用屬性動畫實現(xiàn)顏色變化的過程,需要的朋友可以參考下
    2024-01-01
  • Android開發(fā)之設(shè)置開機自動啟動的幾種方法

    Android開發(fā)之設(shè)置開機自動啟動的幾種方法

    這篇文章主要介紹了Android開發(fā)之設(shè)置開機自動啟動的幾種方法的相關(guān)資料,這里提供三種方法幫助大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-08-08
  • Android實現(xiàn)View滑動效果的6種方法

    Android實現(xiàn)View滑動效果的6種方法

    這篇文章主要介紹了Android實現(xiàn)View滑動的6種方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Android APP之WebView校驗SSL證書的方法

    Android APP之WebView校驗SSL證書的方法

    這篇文章主要介紹了Android APP之WebView校驗SSL證書的方法,需要的朋友可以參考下
    2017-09-09
  • Android切面編程知識點詳解

    Android切面編程知識點詳解

    這篇文章給大家整理了關(guān)于Android進階資深開發(fā)必備技能-切面編程的相關(guān)知識點內(nèi)容,有興趣的朋友可以參考學(xué)習(xí)下。
    2018-07-07
  • Android Lock鎖實現(xiàn)原理詳細分析

    Android Lock鎖實現(xiàn)原理詳細分析

    這篇文章主要介紹了Android Lock鎖實現(xiàn)原理,Lock接口的實現(xiàn)類提供了比使用synchronized關(guān)鍵字更加靈活和廣泛的鎖定對象操作,而且是以面向?qū)ο蟮姆绞竭M行對象加鎖
    2023-02-02
  • 淺析Android中g(shù)etWidth()和getMeasuredWidth()的區(qū)別

    淺析Android中g(shù)etWidth()和getMeasuredWidth()的區(qū)別

    這篇文章主要介紹了淺析Android中g(shù)etWidth()和getMeasuredWidth()的區(qū)別 ,getMeasuredWidth()獲取的是view原始的大小,getWidth()獲取的是這個view最終顯示的大小,具體區(qū)別介紹大家參考下本文
    2018-04-04
  • Android仿微信二維碼和條形碼

    Android仿微信二維碼和條形碼

    這篇文章主要介紹了Android仿微信二維碼生成以及條形碼生成具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Android開發(fā)懸浮按鈕 Floating ActionButton的實現(xiàn)方法

    Android開發(fā)懸浮按鈕 Floating ActionButton的實現(xiàn)方法

    這篇文章主要介紹了Android開發(fā)懸浮按鈕 Floating ActionButton的實現(xiàn)方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • internal修飾符探索kotlin可見性控制詳解

    internal修飾符探索kotlin可見性控制詳解

    這篇文章主要為大家介紹了internal修飾符探索kotlin可見性控制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11

最新評論

临清市| 通海县| 宁国市| 刚察县| 资溪县| 安仁县| 竹北市| 喀喇沁旗| 噶尔县| 射洪县| 萨嘎县| 始兴县| 怀来县| 抚松县| 武平县| 东平县| 麻阳| 北川| 视频| 桃园县| 美姑县| 越西县| 长子县| 沭阳县| 临西县| 融水| 松溪县| 西乌珠穆沁旗| 旌德县| 噶尔县| 丹东市| 泾川县| 渑池县| 东辽县| 安阳市| 阿拉善盟| 肃宁县| 兴义市| 启东市| 翁源县| 宜州市|