android中网络访问学习
来源:互联网 发布:江湖笑歌词.知乎 编辑:程序博客网 时间:2024/05/22 04:53
1、android 原生的访问api有2个:
HttpUrlConnection和HttpClient,它们对封装Socket进行封装,让HTTP请求变得简单。
分析:socket是java底层的通信方式,使用的协议是tcp/ip.
而httpclient是模拟(或者说使用)我们日常使用的http协议,也就是说httpclient直接使用的http协议.
而tcp/ip协议是http协议的底层实现.
也就是说http协议要转换成tcp/ip协议.
从java的角度来说,就是httpclient间接的使用了socket来通信.
httpclient—http—socket(java底层通信)—tcp/ip
socket通信是基于 tcp 或者udp 2种方式,通常来说都是基于tcp协议的。
1 httpclient
HttpClient 是 Apache Jakarta Common 下的子项目
导包:
commons-httpclient-版本号.jar
Apache HttpClient早就不推荐httpclient,5.0之后干脆废弃,后续会删除。6.0删除了HttpClient。Java开发用HttpClient,官方推荐Android开发用HttpUrlConnection。
2 httpurlconnection
Google自带的,JDK里面自带的URLConnection
不过在Android 2.2版本之前,HttpURLConnection一直存在着一些令人厌烦的bug。比如说对一个可读的InputStream调用close()方法时,就有可能会导致连接池失效了。
在android 2.2及以下版本中HttpUrlConnection存在着一些bug,所以建议在android 2.3以后使用HttpUrlConnection,2.3之前使用HttpClient。
如果你看过Volley的源代码,就知道
当
SDK>9时,默认使用HttpUrlConnection,
<9的就用HttpClient。
volley其实是集成这2中方法,进行封装。
说明这2中方法都存在缺点,现在又出来一种请求方式:
OkHttp
下载:
https://square.github.io/okhttp/
导包:
http://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/3.2.0/okhttp-3.2.0.jar
尽管Google在大部分安卓版本中推荐使用HttpURLConnection,但是这个类相比HttpClient实在是太难用,太弱爆了。
OkHttp是一个相对成熟的解决方案,据说Android4.4的源码中可以看到HttpURLConnection已经替换成OkHttp实现了。所以我们更有理由相信OkHttp的强大。
OkHttp额外提供HttpUrlConnection和HttpClient的写法。你只需要再依赖okhttp-urlconnection.jar或者okhttp-apache.jar就可以了。
OkHttp 是一个很棒HTTP客户端:
支持SPDY, 可以合并多个到同一个主机的请求 使用连接池技术减少请求的延迟(如果SPDY是可用的话) 使用GZIP压缩减少传输的数据量 缓存响应避免重复的网络请求
OkHttp可以替换Apache的HttpClient
OkHttp支持2.3和以上版本,对于Java,需要jdk1.7 ,OkHttp需要依赖Okio包
import java.io.IOException; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; public class PostExample { public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); OkHttpClient client = new OkHttpClient(); String post(String url, String json) throws IOException { RequestBody body = RequestBody.create(JSON, json); Request request = new Request.Builder() .url(url) .post(body) .build(); try (Response response = client.newCall(request).execute()) { return response.body().string(); } } String bowlingJson(String player1, String player2) { return "{'winCondition':'HIGH_SCORE'," + "'name':'Bowling'," + "'round':4," + "'lastSaved':1367702411696," + "'dateStarted':1367702378785," + "'players':[" + "{'name':'" + player1 + "','history':[10,8,6,7,8],'color':-13388315,'total':39}," + "{'name':'" + player2 + "','history':[6,10,5,10,10],'color':-48060,'total':41}" + "]}"; } public static void main(String[] args) throws IOException { PostExample example = new PostExample(); String json = example.bowlingJson("Jesse", "Jake"); String response = example.post("http://www.roundsapp.com/post", json); System.out.println(response); } }
参考:
http://www.cnblogs.com/stay/p/4857901.html
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0106/2275.html
目前还有
https://github.com/square/retrofit
square的retrofit、retrofit2.0 项目:
Retrofit 2.0中,OkHttp 是必须的,并且自动设置为了依赖。
OkHttp 在Retrofit 1.9里是可选的。如果你想让Retrofit 使用OkHttp 作为HTTP 连接接口,你需要手动包含okhttp 依赖。
但是在Retrofit 2.0中,OkHttp 是必须的,并且自动设置为了依赖。
Retrofit 、OkHttp 都是 square 的,牛逼公司。
开源社区应该感谢Square、LinkedIn、Google、Facebook、Twitter
国外著名 Android 开发者及公司信息:
http://codekk.com/blogs/detail/codekk/%E5%9B%BD%E5%A4%96%E8%91%97%E5%90%8D%20android%20%E5%BC%80%E5%8F%91%E8%80%85%E5%8F%8A%E5%85%AC%E5%8F%B8%E4%BF%A1%E6%81%AF
- android中网络访问学习
- Android(OPhone) 学习笔记 - 网络访问
- Android学习使用HTTP协议访问网络
- android学习——网络访问HttpURLConnection
- Android中访问网络的方式
- android中线程的开启,访问网络
- Android中访问网络的方式
- android中使用http协议访问网络
- Android Http访问网络 学习(慕课网学习)
- 【Android 学习笔记】 之 使用HTTP协议访问网络
- android学习二十(使用HTTP协议访问网络)
- android学习之使用HTTP协议访问网络
- android学习——使用开源程序AsyncHttpClient访问网络
- Android网络访问库 - Retrofit学习(1)基础
- Android学习之网络请求(访问网路数据)一
- android的网络访问
- android的网络访问
- android 网络访问超时
- 获取指定包名下所有的类
- Android四大基本组件
- MATLAB卸载时提示exception calling main的问题
- 多模块Maven(sg-uap)项目部署到tomcat
- 过充保护,过充恢复,过放保护,过放恢复
- android中网络访问学习
- Java+Selenium3.0基础篇2-利用geckodirver启动firefox
- boost C++ read from serial port with timeout example
- 从零开始理解JAVA事件处理机制(1)
- Tarjan缩点 BZOJ 1051 受欢迎的牛
- Linux内核中的信号(一)
- session 介绍+保存
- C#中转换函数Convert、Parse、TryParse、(int) 的区别
- Spark RDD API 参考示例(一)