Android网络访问:HttpURLConnection与HttpClient详解及封装

0 下载量 187 浏览量 更新于2024-09-02 收藏 73KB PDF 举报
"本文将深入探讨Android开发中两种常用的网络访问方式:HttpURLConnection和HttpClient,以及它们的使用和封装技巧。" 在Android应用开发中,与服务器进行数据交换是常见的需求,HTTP作为最广泛使用的网络通信协议,是实现这一功能的重要手段。在Android中,我们通常有两种方式来实现HTTP通信:HttpURLConnection和HttpClient。这两种方式各有优缺点,选择哪种取决于具体项目需求和性能考虑。 首先,无论是使用HttpURLConnection还是HttpClient,都需要在`AndroidManifest.xml`中添加互联网访问权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` ### 2. HttpURLConnection HttpURLConnection是Java标准库中的类,它在API级别1以上就已经可用,因此支持所有版本的Android。HttpURLConnection的使用相对简单,且更易于控制网络连接,比如设置超时时间,支持HTTP/2等。下面是一个简单的GET请求示例: ```java import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public void connectWithHttpURLConnection() { new Thread(new Runnable() { @Override public void run() { HttpURLConnection connection = null; try { URL url = new URL("http://www.jb51.net"); connection = (HttpURLConnection) url.openConnection(); // 设置请求方法 connection.setRequestMethod("GET"); // 设置连接和读取超时 connection.setConnectTimeout(8000); connection.setReadTimeout(8000); // 获取响应码,200表示成功 int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { // 读取响应 InputStream in = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String line; while ((line = reader.readLine()) != null) { // 处理响应内容 } reader.close(); } } catch (Exception e) { // 处理异常 } finally { if (connection != null) { connection.disconnect(); // 断开连接 } } } }).start(); } ``` ### 3. HttpClient HttpClient是Apache HTTP Components的一部分,它提供了一个更高级的API,允许更复杂的HTTP操作,如Cookie管理、重试策略等。然而,HttpClient自API级别22起已被弃用,尽管在某些情况下仍可使用,但不推荐在新的Android项目中使用。 ```java import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; public void connectWithHttpClient() { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet("http://www.jb51.net"); HttpResponse httpResponse; try { httpResponse = httpClient.execute(httpGet); int status = httpResponse.getStatusLine().getStatusCode(); if (status == 200) { // 处理响应 } } catch (Exception e) { // 处理异常 } finally { httpClient.getConnectionManager().shutdown(); // 关闭连接管理器 } } ``` ### 4. 封装与优化 为了提高代码复用性和可维护性,通常会将网络请求封装到一个单独的网络访问库或服务中。可以创建一个网络请求工具类,提供静态方法来处理GET和POST请求,同时处理异常、超时和连接关闭等细节。 例如,可以创建一个`NetworkUtils`类: ```java public class NetworkUtils { public static String sendGetRequest(String url) throws Exception { // 实现GET请求逻辑 } public static String sendPostRequest(String url, HashMap<String, String> params) throws Exception { // 实现POST请求逻辑 } } ``` 这样,应用的其他部分只需要调用`NetworkUtils`的相关方法即可完成网络请求,无需关心底层实现。 总结,Android中进行HTTP通信时,HttpURLConnection提供了更现代、轻量级的解决方案,而HttpClient虽然功能强大但已过时。在实际开发中,根据项目的特性和需求,可以选择合适的网络访问方式,并通过封装来提高代码质量。在处理网络请求时,要注意线程管理,避免阻塞UI线程,同时要确保良好的错误处理和资源释放机制。