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 // 设置重定向,缺省为 true
138
139 HttpClientParams.setRedirecting(params, true );
140
141
142
143 // 设置 user agent
144  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 HttpClient
152
153 // 中的用法,在 Android 1.5 中我们需要使用 Apache 的缺省实现 DefaultHttpClient
154
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. 360buy android 首页打开网络监控数据分析
  2. Android 学生管理系统 之 SQLite数据库操作
  3. Android接口和框架学习
  4. Android客户端和服务器端数据交互的第四种方法
  5. Android多媒体数据库详解
  6. Android SQLite 数据库的使用

随机推荐

  1. AOSP和Chromium的Android WebViewTest
  2. 解决android模拟器无法上网问题
  3. Android与Java AIO实现简单Echo服务器与
  4. android 项目串口通信(serialPort)开发遇到
  5. android 已知资源名称获取资源ID
  6. 如果获取android源码
  7. windows8.1下android开发环境搭建(Eclips
  8. AndroidStudio安装apk时失败时提示INSTAL
  9. android:string.xml文件中的整型和string
  10. Android 图片裁剪之三剑式(二)