android中网络访问学习

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值