1、标准Java接口(HttpURLConnection)
基本用法
获取实例:通过new URL(urlString).openConnection()
方法获取HttpURLConnection
实例,其中urlString
是目标网址的字符串表示形式。
设置请求方法:使用setRequestMethod("GET")
或setRequestMethod("POST")
等方法设置HTTP请求的方法,GET用于获取数据,POST用于提交数据。
设置超时时间:可以调用setConnectTimeout(int timeout)
和setReadTimeout(int timeout)
方法分别设置连接超时和读取超时的毫秒数。
获取输入流:连接成功后,使用getInputStream()
方法获取服务器返回的输入流,然后通过InputStreamReader
和BufferedReader
等对输入流进行读取。
断开连接:完成操作后,调用disconnect()
方法关闭HTTP连接。
示例代码
new Thread(new Runnable() { @Override public void run() { HttpURLConnection connection = null; BufferedReader reader = null; try { URL url = new URL("https://www.baidu.com"); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(8000); connection.setReadTimeout(8000); InputStream in = connection.getInputStream(); reader = new BufferedReader(new InputStreamReader(in)); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } showData(response.toString()); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } if (connection != null) { connection.disconnect(); } } } }).start();
2、Apache接口(HttpClient)
基本用法
创建HttpClient对象:通常使用DefaultHttpClient
类来创建HttpClient
对象,但在Android 6.0及以上版本中,官方已不推荐使用HttpClient
,并且在后续版本中将其删除。
创建HttpGet或HttpPost对象:根据请求类型,创建HttpGet
或HttpPost
对象,并设置请求的URL和参数。
执行请求:使用HttpClient
对象的execute()
方法执行请求,返回一个HttpResponse
对象。
获取响应内容:通过HttpResponse
对象的getEntity()
方法获取响应实体,然后使用EntityUtils
类的toString()
等方法将响应实体转换为字符串或其他需要的数据格式。
示例代码(以下代码仅作参考,在Android 6.0及以上版本中可能无法直接使用)
HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet("https://www.baidu.com"); try { HttpResponse response = client.execute(get); HttpEntity entity = response.getEntity(); String result = EntityUtils.toString(entity); System.out.println(result); } catch (Exception e) { e.printStackTrace(); }
3、其他网络访问方式
OkHttp:是一个高效的HTTP客户端,支持同步和异步请求,并且实现了spdy、http2、websocket协议,它提供了简洁易用的API,并且性能优异,被广泛应用于各种Android应用中,使用OkHttp发送请求的基本步骤包括创建OkHttpClient对象、构建Request对象、发送请求并处理响应。
Volley:是一个轻量级的网络请求库,主要用于快速地进行JSON数据的解析和网络图片的加载,它支持多种请求方式,如GET、POST等,并且具有自动缓存机制,可以提高网络请求的效率,但Volley不支持同步请求,且在功能拓展性上相对有限。
Retrofit:是一个RESTful的HTTP网络请求框架的封装,专注于接口的封装和解耦,它通过注解来配置请求参数和请求方式,使得代码更加简洁和易于维护,Retrofit内部集成了OkHttp作为网络请求的实现,因此也具备了OkHttp的高效性能。
Socket:是一种基于TCP/IP协议的网络通信方式,可以直接与服务器建立连接并进行数据传输,使用Socket进行网络通信需要手动处理连接的建立、数据的发送和接收以及连接的关闭等操作,适用于需要进行低层次网络通信的场景,如实时聊天、文件传输等。
网络访问方式 | 优点 | 缺点 | 适用场景 |
HttpURLConnection | Android内置,无需额外添加库;可自由定制请求方法和参数 | API较为复杂,需要手动管理连接和处理异常 | 简单的HTTP请求,如GET、POST请求获取数据 |
HttpClient | 操作简单,封装性好;功能强大,支持多种HTTP特性 | 已被官方弃用,不再维护和更新;在Android 6.0及以上版本中存在兼容性问题 | 复杂的HTTP请求,需要使用到高级特性时(不推荐在新的项目中使用) |
OkHttp | 性能高,支持多种协议;API简洁易用,文档丰富;支持同步和异步请求 | 相对较新,需要添加依赖库;对于简单的请求,学习成本可能稍高 | 大多数网络请求场景,尤其是对性能和功能要求较高的场景 |
Volley | 轻量级,适合快速开发;自带缓存机制,提高请求效率;支持多种请求方式 | 功能拓展性有限,不适合大文件上传和下载;不支持同步请求 | 大量的小数据传输和频繁的网络请求场景,如图片加载、数据刷新等 |
Retrofit | 专注于接口封装,代码简洁清晰;与OkHttp集成,性能优异;支持多种数据格式和转换器 | 对于初学者来说,学习曲线较陡;需要配合其他库(如Gson、Moshi等)进行数据解析 | 构建RESTful API客户端,与后端服务进行交互 |
Socket | 可直接与服务器进行低层次的通信,数据传输效率高;适用于实时性要求高的场景 | 需要手动处理底层细节,如字节流的编码和解码、连接的管理等;开发和维护成本较高 | 实时聊天、在线游戏、远程控制等需要实时双向通信的应用 |
1、为什么Android 6.0以后废弃了HttpClient?
解答:Android 6.0废弃HttpClient主要有以下原因,一是其API设计较为陈旧,随着技术的发展,其性能和灵活性已不能满足日益复杂的网络需求,二是它的线程模型存在问题,在Android的ART虚拟机上可能导致应用崩溃,而Android团队推出了更优秀的OkHttp库来替代它,OkHttp在性能、易用性和功能扩展性等方面都表现出色,能够更好地适应现代移动应用的网络开发需求。
2、OkHttp与HttpURLConnection相比有哪些优势?
解答:OkHttp相比HttpURLConnection具有多方面的优势,在性能上,OkHttp经过高度优化,支持连接池、多路复用等技术,能有效减少网络延迟和资源消耗,提高请求速度,在易用性方面,OkHttp的API设计简洁直观,使用注解和链式调用等方式,使代码更加简洁易懂,减少了代码量和出错概率,功能上,OkHttp支持更多的HTTP特性和协议,如spdy、http2、websocket等,并且提供了更丰富的配置选项和拦截器机制,方便开发者进行定制化开发。