編輯:Android開發實例
* 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(jb51.net).rar
項目打包生成apk過程: 1、生成簽名文件,並且指定所在位置 2、使用生成的簽名文件,給工程打包生成一個apk 生成簽名文件,並且指定所在位置
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我
學習目的: 1、掌握在Android中如何建立Gallery 2、初步理解Android適配器的原理 3、實現簡單的控件縮放動畫 簡介: 1、Gallery是An
本章介紹android高級開發中,對於性能方面的處理。主要包括電量,視圖,內存三個性能方面的知識點。 1.視圖性能 (1)Overdraw簡介