Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 高級開發 >> Android網絡開發詳解

Android網絡開發詳解

編輯:高級開發

 1. 概要

  本文主要介紹在android平台上開發網絡應用的一些常用接口。

  2. android平台上可以使用的幾種網絡接口

  android平台的網絡應用絕大部分都是基於Java的編程接口的,也就是說我們開發類似的運用的時候可以有多種選擇,比J2ME確實好多了。

  2.1. 標准Java接口

  Java.Net.*下面提供了訪問 HTTP 服務的基本功能。使用這部分接口的基本操作主要包括:

  創建 URL 以及 URLConnection / HttpURLConnection 對象

  設置連接參數

  連接到服務器

  向服務器寫數據

  從服務器讀取數據

  1 import java.io.InputStream; 2 3 import java.io.OutputStream; 4 5 import java.net.URL; 6 7 import java.net.URLConnection; 8 9 import Java.Net.HttpURLConnection; 10 11 12 13 try { 14 15 // 創建一個 URL 對象 16 17 URL url = new URL(your_url); 18 19 20 21 // 創建一個 URL 連接,如果有代理的話可以指定一個代理。 22 23 URLConnection connection = url.openConnection(Proxy_yours); 24 25 // 對於 HTTP 連接可以直接轉換成 HttpURLConnection, 26 27 // 這樣就可以使用一些 HTTP 連接特定的方法,如 setRequestMethod() 等 28 29 //HttpURLConnection connection = 30 31 (HttpURLConnection)url.openConnection(Proxy_yours); 32 33 34 35 // 在開始和服務器連接之前,可能需要設置一些網絡參數 36 37 connection.setConnectTimeout(10000); 38 39 connection.addRequestProperty("User-Agent", 40 41 "J2ME/MIDP2.0"); 42 43 44 45 // 連接到服務器 46 47 connection.connect(); 48 49 50 51 // 往服務器寫數據,數據會暫時被放到內存緩存區中 52 53 // 如果僅是一個簡單的 HTTP GET,這一部分則可以省略 54 55 OutputStream outStream = connection.getOutputStream(); 56 57 ObjectOutputStream objOutput = new ObjectOutputStream(outStream); 58 59 objOutput.writeObject(new String("this is a string...")); 60 61 objOutput.flush(); 62 63 64 65 // 向服務器發送數據並獲取應答 66 67 InputStream in = connection.getInputStream(); 68 69 70 71 // 處理數據 72 73 ... 74 75 76 77 } catch (Exception e) { 78 79 // 網絡讀寫操作往往會產生一些異常,所以在具體編寫網絡應用時 80 81 //

  接上頁

最好捕捉每一個具體以采取相應措施 82 83 }

  2.2. apache接口

  apache HttpClIEnt 是一個開源項目,彌補了 Java.Net.* 靈活性不足的缺點,為客戶端的HTTP編程提供高效、最新、功能豐富的工具包支持。Android 平台引入了 apache HttpClIEnt 的同時還提供了對它的一些封裝和擴展,例如設置缺省的HTTP超時和緩存大小等。早期的 android 曾同時包括 Commons HttpClient (org.apache.commons.httpclIEnt.*) 和 HttpComponents (org.apache.http.clIEnt.*),不過當前版本 (1.5) 中開發者只能使用後者,也就是說類似以下的一些類:

  使用這部分接口的基本操作與 Java.Net.* 基本類似,主要包括:

  創建 HttpClIEnt 以及 GetMethod / PostMethod, HttpRequest 等對象

  設置連接參數

  執行 HTTP 操作

  處理服務器返回結果

  1 import org.apache.http.HttpEntity; 2 3 import org.apache.http.HttpHost; 4 5 import org.apache.http.HttpResponse; 6 7 import org.apache.http.auth.AuthScope; 8 9 import org.apache.http.auth.UsernamePassWordCredentials; 10 11 import org.apache.http.clIEnt.methods.HttpGet; 12 13 import org.apache.http.conn.params.ConnRoutePNames; 14 15 import org.apache.http.params. HttpConnectionParams; 16 17 import org.apache.http.client.params. HttpClientParams; 18 19 20 21 try { 22 23 // 創建 HttpParams 以用來設置 HTTP 參數(這一部分不是必需的) 24 25 HttpParams params = new BasicHttpParams(); 26 27 28 29 // 設置連接超時和 Socket 超時,以及 Socket 緩存大小 30 31 HttpConnectionParams.setConnectionTimeout(params, 20 * 1000); 32 33 HttpConnectionParams.setSoTimeout(params, 20 * 1000); 34 35 HttpConnectionParams.setSocketBufferSize(params, 8192); 36 37 38 39 // 設置重定向,缺省為 true 40 41 HttpClientParams.setRedirecting(params, true); 42 43 44 45 // 設置 user agent 46 47 HttpProtocolParams.setUserAgent(params, userAgent); 48 49 50 51 // 創建一個 HttpClient 實例 52 53 // 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClIEnt 54 55 // 中的用法,在 android 1.5 中我們需要使用 apache 的缺省實現 DefaultHttpClient 56 57 HttpClient httpClient = new DefaultHttpClIEnt(params);

  接上頁

58 59 60 61 // 創建 HttpGet 方法,該方法會自動處理 URL 地址的重定向 62 63 HttpGet httpGet = new HttpGet ("http://www.test_test.com/"); 64 65 66 67 HttpResponse response = client.execute(httpGet); 68 69 if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { 70 71 // 錯誤處理,例如可以在該請求正常結束前將其中斷 72 73 httpGet.abort(); 74 75 } 76 77 78 79 // 讀取更多信息 80 81 Header[] headers = response.getHeaders(); 82 83 HttpEntity entity = response.getEntity(); 84 85 Header header = response.getFirstHeader("Content-Type"); 86 87 } catch (Exception ee) { 88 89 // 90 91 } finally { 92 93 // 釋放連接 94 95 clIEnt.getConnectionManager().shutdown(); 96 97 } 98 99 import org.apache.http.HttpEntity;100 101 import org.apache.http.HttpHost;102 103 import org.apache.http.HttpResponse;104 105 import org.apache.http.auth.AuthScope;106 107 import org.apache.http.auth.UsernamePassWordCredentials;108 109 import org.apache.http.clIEnt.methods.HttpGet;110 111 import org.apache.http.conn.params.ConnRoutePNames;112 113 import org.apache.http.params. HttpConnectionParams;114 115 import org.apache.http.client.params. HttpClientParams;116 117 118 119 try {120 121 // 創建 HttpParams 以用來設置 HTTP 參數(這一部分不是必需的)122 123 HttpParams params = new BasicHttpParams();124 125 126 127 // 設置連接超時和 Socket 超時,以及 Socket 緩存大小128 129 HttpConnectionParams.setConnectionTimeout(params, 20 * 1000);130 131 HttpConnectionParams.setSoTimeout(params, 20 * 1000);132 133 HttpConnectionParams.setSocketBufferSize(params, 8192);134 135 136 137 // 設置重定向,缺省為 true138 139 HttpClIEntParams.setRedirecting(params, true);140 141 142 143 // 設置 user agent144  String userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2) Gecko/20100115 Firefox/3.6";145 HttpProtocolParams.setUserAgent(params, userAgent);146 147 148 149 // 創建一個 HttpClient 實例150 151 // 注意 HttpClient httpClient = new HttpClIEnt(); 是Commons

  接上頁

HttpClIEnt152 153 // 中的用法,在 android 1.5 中我們需要使用 apache 的缺省實現 DefaultHttpClient154 155 HttpClient httpClient = new DefaultHttpClient(params);156 157 158 159 // 創建 HttpGet 方法,該方法會自動處理 URL 地址的重定向160 161 HttpGet httpGet = new HttpGet ("http://www.test_test.com/");162 163 164 165 HttpResponse response = client.execute(httpGet);166 167 if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {168 169 // 錯誤處理,例如可以在該請求正常結束前將其中斷170 171 httpGet.abort();172 173 }174 175 176 177 // 讀取更多信息178 179 Header[] headers = response.getHeaders();180 181 HttpEntity entity = response.getEntity();182 183 Header header = response.getFirstHeader("Content-Type");184 185 } catch (Exception ee) {186 187 //188 189 } finally {190 191 // 釋放連接192 193 client.getConnectionManager().shutdown();194 195 }196 197 以下例子以 HttpGet 方式通過代理訪問 HTTPS 網站:198 199 try { 200 201 HttpClient httpClient = new HttpClient(); 202 203 204 205 // 設置認證的數據 206 207 httpClIEnt.getCredentialsProvider().setCredentials( 208 209 new AuthScope("your_auth_host", 80, "your_realm"), 210 211 new UsernamePasswordCredentials("username", "passWord")); 212 213 214 215 // 設置服務器地址,端口,訪問協議 216 217 HttpHost targetHost = new HttpHost("www.test_test.com", 443, "https"); 218 219 220 221 // 設置代理 222 223 HttpHost proxy = new HttpHost("192.168.1.1", 80); 224 225 httpClIEnt.getParams().setParameter 226 227 (ConnRoutePNames.DEFAULT_PROXY, proxy); 228 229 230 231 // 創建一個 HttpGet 實例 232 233 HttpGet httpGet = new HttpGet("/a/b/c"); 234 235 236 237 // 連接服務器並獲取應答數據 238 239 HttpResponse response = httpClIEnt.execute(targetHost, httpGet); 240 241 242 243 // 讀取應答數據 244 245 int statusCode = response.getStatusLine().getStatusCode(); 246 247 Header[] headers = response.getHeaders(); 248 249 HttpEntity entity = response.getEntity(); 250 251 } catch (Exception ee) {

  2.3. android接口

  接上頁

  android.Net.* 實際上是通過對 apache 的 HttpClIEnt 的封裝來實現的一個 HTTP 編程接口,同時還提供了 HTTP 請求隊列管理, 以及 HTTP 連接池管理,以提高並發請求情況下(如轉載網頁時)的處理效率,除此之外還有網絡狀態監視等接口。

  以下是一個通過 androidHttpClIEnt 訪問服務器的最簡例子:

  1 import import android.Net.http.AndroidHttpClient; 2 3 try { 4 5 AndroidHttpClient clIEnt = androidHttpClient.newInstance(“your_user_agent”); 6 7 8 9 // 創建 HttpGet 方法,該方法會自動處理 URL 地址的重定向 10 11 HttpGet httpGet = new HttpGet ("http://www.test_test.com/"); 12 13 14 15 HttpResponse response = client.execute(httpGet); 16 17 if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { 18 19 // 錯誤處理 20 21 } 22 23 24 25 // 關閉連接 26 27 clIEnt.close(); 28 29 } catch (Exception ee) { 30 31 // 32 33 }

  另外當我們的應用需要同時從不同的主機獲取數目不等的數據,並且僅關心數據的完整性而不關心其先後順序時,也可以使用這部分的接口。典型用例就是 android.webkit 在轉載網頁和下載網頁資源時,具體可參考 android.webkit.* 中的相關實現。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved