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

原创粉丝点击