編輯:高級開發
本文主要介紹在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.* 中的相關實現。
學習android DDMS時,經常會遇到android DDMS問題,這裡將介紹android DDMS問題的解決方法。Android DDMS有很多值得學習的地方,
android系統應該是Google公司所有軟件中發展最為迅速的,相信這款android系統在與微軟與諾基亞等幾大手機運營商的抗衡中會取得良好的成績的,android系
android系統為研發數據庫的技術人員對Team System承諾,提供相關工具,這樣可以為整個軟件開發周期少了不少彎路,降低工作的復雜性,尤其是智能手機,安裝及使用
ock; margin-left: auto; margin-right: auto; src=/School/UploadFiles_7810/201203/2012