a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 系統 > Android > 正文

Android中AsyncTask的用法實例分享

2020-04-11 11:53:45
字體:
來源:轉載
供稿:網友

*  AsyncTask

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

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

      AsyncTask是抽象類,子類必須實現抽象方法doInBackground(Params... p) ,在此方法中實現任務的執行工作,比如連接網絡獲取數據等。通常還應該實現onPostExecute(Result r)方法,因為應用程序關心的結果在此方法中返回。需要注意的是AsyncTask一定要在主線程中創建實例。AsyncTask定義了三種泛型類型 Params,Progress和Result。

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

      AsyncTask 的執行分為四個步驟,與前面定義的TaskListener類似。每一步都對應一個回調方法,需要注意的是這些方法不應該由應用程序調用,開發者需要做的就是實現這些方法。在任務的執行過程中,這些方法被自動調用。

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

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

復制代碼 代碼如下:

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

        // 可變長的輸入參數,與AsyncTask.exucute()對應 
        @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) { 
                            // 如果知道響應的長度,調用publishProgress()更新進度 
                            publishProgress((int) ((count / (float) length) * 100)); 
                        } 
                        // 為了在模擬器中清楚地看到進度,讓線程休眠100ms 
                        Thread.sleep(100); 
                    } 
                    s = new String(baos.toByteArray());            } 
                // 返回結果 
                return s; 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } 
            return null; 
        } 
        @Override 
        protected void onCancelled() { 
            super.onCancelled(); 
        } 
        @Override 
        protected void onPostExecute(String result) { 
            // 返回HTML頁面的內容 
            message.setText(result); 
        } 
        @Override 
        protected void onPreExecute() { 
            // 任務啟動,可以在這里顯示一個對話框,這里簡單處理 
            message.setText(R.string.task_started); 
        } 
        @Override 
        protected void onProgressUpdate(Integer... values) { 
            // 更新進度 
            message.setText(values[0]); 
        } 
    }

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

復制代碼 代碼如下:

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

下載實例: testAsync(VeVB.COm).rar

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美一级一区 | 亚洲视频在线看 | 精品久久一区二区 | 黄色一级片视频播放 | 日韩三级在线播放 | 在线视频a| 国产一区av在线 | 国产免费黄色 | 91国产精品 | 国产中文区二幕区2012 | av一级毛片 | 国产日韩欧美亚洲 | 日韩久草| 国产亚洲一区二区三区在线观看 | 少妇一区二区三区毛片免费下载看 | 国产成人精品网 | 超碰香蕉 | 成人在线免费av | 精品精品久久 | 国产成人精品综合 | 日韩性视频 | 亚洲欧洲av在线 | 国产一级在线观看 | 成人在线观看亚洲 | 国产露脸150部国语对白 | 中文字幕国产在线观看 | 亚洲一级簧片 | 精品久久久久久久久久 | 亚洲精品久久久久久久久久久 | 成人性视频在线 | 日本aa级毛片免费观看 | 99精品欧美一区二区三区综合在线 | 丝袜久久| 欧美精品久久久久久久亚洲调教 | www国产在线观看 | 性瘾调教校园h | 国产亚洲欧美在线 | 中国1级黄色片 | 欧美一区二区免费 | 久久精品久久精品国产大片 | 成人高清视频在线观看 |