网络要是android客户端非常要紧的部分。简书作者。2、提供的恢宏功能。

Retrofit&RestAPI

Retrofit巨大的简化了网要的操作,它应当说只是是一个Rest
API管理库,它是直下OKHttp进行网络要并无影响您针对OkHttp进行配备。毕竟还是Square公司出品。
RestAPI是相同种植软件设计风格。
服务器作为资源存放地。客户端去请GET,PUT,
POST,DELETE资源。并且是任状态的,没有session的厕。
活动端和服务器交互最要害之尽管是API的计划。比如就是一个正式的登录接口。

Paste_Image.png

你们该看的起这接口对应之请保管以及应包约是什么样子吧。
吁方式,请求参数,响应数据,都挺清晰。
应用Retrofit这些API可以直观的体现在代码中。

Paste_Image.png

下一场使Retrofit提供被您的这接口的落实类
就能够直接进行网络要获得结构数据。

顾Retrofit2.0互为较1.9拓展了汪洋未兼容更新。google上多数学科都是根据1.9之。这里有个2.0的教程。

课程里展开异步请求是利用Call。Retrofit最精的地方在支持RxJava。就比如本人上图被回到的是一个Observable。RxJava上亲手难度比大,但就此过就算再为离不上马了。Retrofit+OkHttp+RxJava配合框架打有成吨的出口,这里不再多说。

网要学习及此处我觉得都到到了。。

HTTP缓存机制

缓存对于移动端是生重要的存。

  • 调减请求次数,减多少服务器压力.
  • 地面数据读取速度还快,让页面不见面空白几百毫秒。
  • 于管网的情况下提供数据。

缓存一般由服务器控制(通过一些方式得以本地控制缓存,比如为过滤器添加缓存控制信息)。通过以呼吁头上加下面几乎个字端:

Request

请求头字段 意义
If-Modified-Since: Sun, 03 Jan 2016 03:47:16 GMT 缓存文件的最后修改时间。
If-None-Match: "3415g77s19tc3:0" 缓存文件的Etag(Hash)值
Cache-Control: no-cache 不使用缓存
Pragma: no-cache 不使用缓存

Response

响应头字段 意义
Cache-Control: public 响应被共有缓存,移动端无用
Cache-Control: private 响应被私有缓存,移动端无用
Cache-Control:no-cache 不缓存
Cache-Control:no-store 不缓存
Cache-Control: max-age=60 60秒之后缓存过期(相对时间)
Date: Sun, 03 Jan 2016 04:07:01 GMT 当前response发送的时间
Expires: Sun, 03 Jan 2016 07:07:01 GMT 缓存过期的时间(绝对时间)
Last-Modified: Sun, 03 Jan 2016 04:07:01 GMT 服务器端文件的最后修改时间
ETag: "3415g77s19tc3:0" 服务器端文件的Etag[Hash]值

专业使用时本需求可能只是含有其中部分字段。
客户端要因这些信息存储这次要信息。
下一场在客户端发起呼吁的当儿如果检查缓存。遵循下面步骤:

图片 1

浏览器缓存机制

注意服务器返回304意思是数尚未改观滚去读缓存信息。
早就年轻的自我耶好写的网络要框架添加到了缓存机制,还得意,直到有同等龙我望了下2单东西。(/TДT)/

测试版本:书旗Android 9.9.0

  • HTTP请求&响应
  • Get&Post
  • [HttpClient & HttpURLConnection](#HttpClient & HttpURLConnection)
  • 同步&异步
  • HTTP缓存机制
  • Volley&OkHttp
  • Retrofit&RestAPI
  • 网络图片加载优化
  • Fresco&Glide
  • 图表管理方案

图表管理方案

再说说图片存储。不要有好服务器上面,徒增流量压力,还没图处理效果。
推荐七牛与阿里云存储(没因此过其它
π__π
)。它们还发生非常重要之平等码图片处理。在图纸Url上助长参数来针对图纸展开有拍卖还传。
遂(七牛的处理代码)

    public static String getSmallImage(String image){
        if (image==null)return null;
        if (isQiniuAddress(image)) image+="?imageView2/0/w/"+IMAGE_SIZE_SMALL;
        return image;
    }

    public static String getLargeImage(String image){
        if (image==null)return null;
        if (isQiniuAddress(image)) image+="?imageView2/0/w/"+IMAGE_SIZE_LARGE;
        return image;
    }

    public static String getSizeImage(String image,int width){
        if (image==null)return null;
        if (isQiniuAddress(image)) image+="?imageView2/0/w/"+width;
        return image;
    }

既然可以加快请求速度,又能压缩流量。再配合Fresco或Glide。完美的图样加载方案。
唯独就便待您把具备图片都存放于七牛要阿里云,这样吗没错。

图表/文件上传也还是运用她第三方存储,它们还出SDK与官文档教你。
可图片一定要是抽了后上传。上传1-2M大之高清照片没有意义。

GET  √ 4.0以后

纱图片加载优化

对于图片的传,就像面的登录接口的avatar字段,并无见面直接将图纸写于回来内容里,而是吃一个图的地方。需要经常再度失加载。

假如您一直用HttpURLConnection去赢得一摆放图,你办得到,不过尚未优化就单纯是独BUG不断demo。绝对不可知规范以。
专注网络图片有些特点:

  1. 它世代不会见转移
    一个链接对应之图形一般永远不见面转换,所以当第一不善加载了图片时,就该与永久缓存,以后就不再网要。

  2. 它们挺占内存
    一致摆图片小之几十k多的几M高清无码。尺寸为是64*64届2k图。你不克不怕如此直白展示到UI,甚至无能够直接放大上内存。

  3. 它们若加载很遥远
    加载一布置图需要几百ms到几m。这之间的UI占各类图功能也是要考虑的。

说说自己于上头提到的RequestVolley里做的图形请处理(没错我开了,这片底代码可以错过github里看源码)。

同步&异步

及时2个概念才设有叫多线程编程中。
android中默认只来一个主线程,也叫UI线程。因为View绘制只能以是线程内展开。
故而要是你死了(某些操作而这个线程在此间运行了N秒)这个线程,这之间View绘制将非可知开展,UI就会卡壳。所以如果使劲避免在UI线程进行耗时操作。
纱要是一个天下无双耗时操作。
由此上面的Utils类进行网络要单生一行代码。

NetUtils.get("http://www.baidu.com");//这行代码将执行几百毫秒。

如若您这样写

        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String response = Utils.get("http://www.baidu.com");
    }

就会死。。
当时就是是共方式。直接耗时操作阻塞线程直到数据接受了毕然后返回。Android不允许的。
异步方式:

         //在主线程new的Handler,就会在主线程进行后续处理。
    private Handler handler = new Handler();
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.text);
        new Thread(new Runnable() {
            @Override
            public void run() {
                    //从网络获取数据
                final String response = NetUtils.get("http://www.baidu.com");
                    //向Handler发送处理操作
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                            //在UI线程更新UI
                        textView.setText(response);
                    }
                });
            }
        }).start();
    }

每当子线程进行耗时操作,完成后通过Handler将更新UI的操作发送至主线程执行。这便受异步。Handler是一个Android线程模型中要害之东西,与网络无关便不说了。关于Handler不了解就先失Google一下。
有关Handler原理同首对的稿子

然而诸如此类形容好丢人。异步通常伴随者他的好基友回调
眼看是通过回调封装的Utils类。

    public class AsynNetUtils {
        public interface Callback{
            void onResponse(String response);
        }

        public static void get(final String url, final Callback callback){
            final Handler handler = new Handler();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    final String response = NetUtils.get(url);
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onResponse(response);
                        }
                    });
                }
            });
        }

        public static void post(final String url, final String content, final Callback callback){
            final Handler handler = new Handler();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    final String response = NetUtils.post(url,content);
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onResponse(response);
                        }
                    });
                }
            });
        }
    }

接下来运办法。

    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.webview);
        AsynNetUtils.get("http://www.baidu.com", new AsynNetUtils.Callback() {
            @Override
            public void onResponse(String response) {
                textView.setText(response);
            }
        });

是匪是雅很多。
嗯,一个傻到哭的纱要方案成型了。
弱质的地方发成百上千:

  • 历次都new Thread,new Handler消耗了大
  • 从未特别处理体制
  • 从未有过缓存机制
  • 尚未到的API(请求头,参数,编码,拦截器等)与调试模式
  • 没有Https

HttpClient Session保持:

Fresco&Glide

非用想为清楚它们都举行了要命全面的优化,重复过去轮子的行为非常笨。
Fresco是Facebook公司之野鸡科技。光看作用介绍就看出非常强劲。使用办法官方博客说的足详细了。
当真三级缓存,变换后的BItmap(内存),变换前之故图片(内存),硬盘缓存。
在内存管理及得了无限。对于重度图片应用的APP应该是怪好的。
其一般是直下SimpleDraweeView来替换ImageView,呃~侵入性较强,依赖上其apk包直接杀1M。代码量惊人。

因而自己重新欣赏Glide,作者是bumptech。这个库房被广泛的应用在google的开源项目中,包括2014年google
I/O大会上揭示之官方app。
这里产生详尽介绍。直接采用ImageView即可,无需初始化,极简的API,丰富的进行,链式调用都是本身好的。
长的开展指的饶是这个。
另外我吗用了Picasso。API与Glide简直一模子一样,功能略少,且发出一半年无修复的BUG。

网要是android客户端非常重大的片。下面从入门级开始介绍下好Android网络要的实施进程。希望能于刚接触Android网络有的心上人有增援。
正文包含:

Volley是谷歌开发的。

Get&Post

网络请求遭逢我们经常因此键值对来导参数(少部分api用json来传递,毕竟不是主流)。
由此地方的牵线,可以看出虽然Post与Get本意一个凡是表单提交一个凡是要页面,但精神并无呀界别。下面说说参数在就2者的职务。

  • Get方式
    在url中填入参数:

      http://xxxx.xx.com/xx.php?params1=value1&params2=value2
    

还是用路由

    http://xxxx.xx.com/xxx/value1/value2/value3

这些就是是web服务器框架的事了。

  • Post方式
    参数是由此编码在请求体中之。编码包括x-www-form-urlencoded
    form-data
    x-www-form-urlencoded的编码方式是如此:
    tel=13637829200&password=123456
    form-data的编码方式是这般:
    —-WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name=”tel”

      13637829200
      ----WebKitFormBoundary7MA4YWxkTrZu0gW
      Content-Disposition: form-data; name="password"
    
      123456
      ----WebKitFormBoundary7MA4YWxkTrZu0gW
    

x-www-form-urlencoded的优越性就不行明显了。不过x-www-form-urlencoded唯其如此传键值对,但是form-data可以传二进制

为url是在为要求行中之。
为此Get与Post区别本质就是参数是位于请求行吃要在请求体
当然无论用啦种都能够在请求头着。一般以伸手求头中加大有殡葬端的常量。

有人说:

  • Get是明文,Post隐藏
    移步端不是浏览器,不用https全都是公开。
  • Get传递数据上限XXX
    胡说。有限制的是浏览器中之url长度,不是Http协议,移动端请求无影响。Http服务器部分来限定的装置一下即可。
  • Get中文需要编码
    是真的…要注意。URLEncoder.encode(params, "gbk");

抑或建议用post规范参数传递方式。并从未啊更美好,只是大家都如此社会再和谐。

方说之是呼吁。下面说响应。
央是键值对,但回来数据我们常常因此Json。
于内存中的组织数据,肯定使就此多少描述语言将目标序列化成文本,再用Http传递,接收端并打文本还原成结构数据。
对象(服务器)<–>文本(Http传输)<–>对象(移动端) 。

服务器返回的数码大部分且是纵横交错的结构数据,所以Json最符合。
Json解析库有诸多Google的Gson,阿里的FastJson。
Gson的用法看这里。

  • HTTP请求&响应
  • Get&Post
  • HttpClient &
    HttpURLConnection
  • 同步&异步
  • HTTP缓存机制
  • Volley&OkHttp
  • Retrofit&RestAPI
  • 网图片加载优化
  • Fresco&Glide
  • 图管理方案

OkHttp 处理了成千上万网疑难杂症:会从广大常用的连问题受到自行还原。

HTTP缓存机制

缓存对于移动端是好重大的存。

  • 减请求次数,减多少服务器压力.
  • 当地数据读取速度又快,让页面不见面空白几百毫秒。
  • 每当管网的情事下提供数据。

缓存一般由服务器控制(通过一些方式得以本地控制缓存,比如为过滤器添加缓存控制信息)。通过以恳求头上加下面几乎只字端:

Request

请求头字段 意义
If-Modified-Since: Sun, 03 Jan 2016 03:47:16 GMT 缓存文件的最后修改时间。
If-None-Match: "3415g77s19tc3:0" 缓存文件的Etag(Hash)值
Cache-Control: no-cache 不使用缓存
Pragma: no-cache 不使用缓存

Response

响应头字段 意义
Cache-Control: public 响应被共有缓存,移动端无用
Cache-Control: private 响应被私有缓存,移动端无用
Cache-Control:no-cache 不缓存
Cache-Control:no-store 不缓存
Cache-Control: max-age=60 60秒之后缓存过期(相对时间)
Date: Sun, 03 Jan 2016 04:07:01 GMT 当前response发送的时间
Expires: Sun, 03 Jan 2016 07:07:01 GMT 缓存过期的时间(绝对时间)
Last-Modified: Sun, 03 Jan 2016 04:07:01 GMT 服务器端文件的最后修改时间
ETag: "3415g77s19tc3:0" 服务器端文件的Etag[Hash]值

专业使用时仍需可能不过含有其中部分字段。
客户端要依据这些信息存储这次要信息。
下一场在客户端发起呼吁的时刻如果检查缓存。遵循下面步骤:

浏览器缓存机制

专注服务器返回304意思是数尚未转滚去念缓存信息。
都年轻的我哉协调写的大网要框架添加到了缓存机制,还得意,直到发生同样龙我视了下面2只东西。(/TДT)/

Retrofit&RestAPI

Retrofit粗大的简化了网要的操作,它应该说只有是一个Rest
API管理库,它是一直利用OKHttp进行网络要并无影响而针对OkHttp进行布置。毕竟都是Square公司出品。
RestAPI是如出一辙种软件设计风格。
服务器作为资源存放地。客户端去要GET,PUT,
POST,DELETE资源。并且是随便状态的,没有session的插足。
走端和服务器交互最根本之就是API的计划性。比如就是一个业内的记名接口。

图片 2

Paste_Image.png

你们应该看之来这接口对应之求保管及响应包约是啊体统吧。
求方式,请求参数,响应数据,都十分清楚。
使用Retrofit这些API可以直观的反映于代码中。

图片 3

Paste_Image.png

接下来用Retrofit提供给您的之接口的贯彻类
就会直接进行网络要获得结构数据。

只顾Retrofit2.0互相较1.9展开了大量非配合更新。google上大部分科目都是根据1.9底。这里有个2.0的教程。

学科里进行异步请求是采取Call。Retrofit最强劲的地方在于支持RxJava。就如自己上图备受回到的是一个Observable。RxJava上亲手难度比强,但就此了就是又为相差不上马了。Retrofit+OkHttp+RxJava配合框架打来成吨的出口,这里不再多说。

纱要学习及此地我认为既到到了。。

纱要是android客户端好要紧之组成部分。下面从入门级开始介绍下团结Android网络要的执行进程。希望会被刚刚接触Android网络有的爱人有赞助。
正文包含:

文/Jude95(简书作者)
原文链接:http://www.jianshu.com/p/3141d4e46240
著作权归作者所有,转载请联系作者获得授权,并标“简书作者”。

缓存重试Https/Http稳定性CookieSession

Volley&OkHttp

Volley&OkHttp应该是今日最常用底纱要求库。用法也颇相像。都是因此构造请求进入请求队列的法门管理网络请求。

先说Volley:
Volley可以经过这个库进展依赖.
Volley在Android 2.3以及以上版本,使用的凡HttpURLConnection,而在Android
2.2同以下版本,使用的凡HttpClient。
Volley的主干用法,网上资料无数,这里推荐郭霖大神的博客
Volley存在一个缓存线程,一个大网请求线程池(默认4独线程)。
Volley这样一直用支出效率会比较小,我用我使用Volley时的各种技术封装成了一个储藏室RequestVolly.
自己于这库房中将构造请求的方封装为了函数式调用。维持一个大局的呼吁队列,拓展一些便宜的API。

但是又怎么封装Volley在职能拓展性上老无法与OkHttp相比。
Volley停止了更新,而OkHttp得到了法定的认同,并于不断优化。
所以我最后替换为OkHttp

OkHttp用法见这里
怪投机的API与详尽的文档。
这篇稿子为刻画的百般详细了。
OkHttp使用Okio进行数据传。都是Square家的。
只是并无是一直用OkHttp。Square公司还发了一个Retrofit库配合OkHttp战斗力翻倍。

HTTP请求&响应

既然说从入门级开始即说说Http请求包的构造。
相同次于呼吁虽是通往目标服务器发送一错文本。什么样的文书?有下结构的文本。
HTTP请求保管结构

图片 4

请求包

例子:

    POST /meme.php/home/user/login HTTP/1.1
    Host: 114.215.86.90
    Cache-Control: no-cache
    Postman-Token: bd243d6b-da03-902f-0a2c-8e9377f6f6ed
    Content-Type: application/x-www-form-urlencoded

    tel=13637829200&password=123456

告了不畏见面收下响应包(如果对面存在HTTP服务器)
HTTP响应包结构

图片 5

响应包

例子:

    HTTP/1.1 200 OK
    Date: Sat, 02 Jan 2016 13:20:55 GMT
    Server: Apache/2.4.6 (CentOS) PHP/5.6.14
    X-Powered-By: PHP/5.6.14
    Content-Length: 78
    Keep-Alive: timeout=5, max=100
    Connection: Keep-Alive
    Content-Type: application/json; charset=utf-8

    {"status":202,"info":"\u6b64\u7528\u6237\u4e0d\u5b58\u5728\uff01","data":null}

Http请求方式发生

方法 描述
GET 请求指定url的数据,请求体为空(例如打开网页)。
POST 请求指定url的数据,同时传递参数(在请求体中)。
HEAD 类似于get请求,只不过返回的响应体为空,用于获取响应头。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。

常用只有Post与Get。

http://www.flysnow.org/2013/11/21/android-httpclitent-session-keep.html

三级缓存

网上时不时说三级缓存--服务器,文件,内存。不过我当服务器无算是一级缓存,那就算是数码源嘛。

  • 外存缓存
    先是内存缓存使用LruCache。LRU是Least Recently Used
    近期至少使用算法,这里确定一个大小,当Map里对象大小总和超此可怜时将运频率低于的对象释放。我将内存大小限制为经过可用内存的1/8.
    外存缓存里读博的多寡就是直回到,读不顶之于硬盘缓存要数。

  • 硬盘缓存
    硬盘缓存使用DiskLruCache。这个类似不在API中。得复制利用。
    见LRU就懂得了吧。我用硬盘缓存大小设置为100M。

      @Override
      public void putBitmap(String url, Bitmap bitmap) {
          put(url, bitmap);
          //向内存Lru缓存存放数据时,主动放进硬盘缓存里
          try {
              Editor editor = mDiskLruCache.edit(hashKeyForDisk(url));
              bitmap.compress(Bitmap.CompressFormat.JPEG, 100, editor.newOutputStream(0));
              editor.commit();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
    
      //当内存Lru缓存中没有所需数据时,调用创造。
      @Override
      protected Bitmap create(String url) {
          //获取key
          String key = hashKeyForDisk(url);
          //从硬盘读取数据
          Bitmap bitmap = null;
          try {
              DiskLruCache.Snapshot snapShot = mDiskLruCache.get(key);
              if(snapShot!=null){
                  bitmap = BitmapFactory.decodeStream(snapShot.getInputStream(0));
              }
          } catch (IOException e) {
              e.printStackTrace();
          }
          return bitmap;
      }
    

DiskLruCache的法则不再说了(我还缓解了她在的一个BUG,向Log中加上的数码增删记录时,最后一长长的没有出口,导致最后一长条缓存一直失效。)

  • 硬盘缓存也从未多少就赶回空,然后便朝着服务器请求数据。

这就算是全体工艺流程。
然本身如此的拍卖方案要生诸多受制。

  • 图未经压缩处理直接存储使用
  • 文本操作以主线程
  • 没完善的图处理API

先前为觉得这样已经足够好直到我遇上下面俩。

Get&Post

网络请求屡遭我们常因此键值对来传参数(少部分api用json来传递,毕竟非是主流)。
由此上面的牵线,可以看虽然Post与Get本意一个凡表单提交一个是呼吁页面,但本质并无什么区别。下面说说参数在当时2者的职务。

  • Get方式
    每当url中填入参数:

      http://xxxx.xx.com/xx.php?params1=value1&params2=value2
    

    竟以路由

      http://xxxx.xx.com/xxx/value1/value2/value3
    

    这些就是web服务器框架的转业了。

  • Post方式
    参数是透过编码在请求体中之。编码包括x-www-form-urlencoded
    form-data
    x-www-form-urlencoded的编码方式是如此:

      tel=13637829200&password=123456
    

    form-data的编码方式是这般:

      ----WebKitFormBoundary7MA4YWxkTrZu0gW
      Content-Disposition: form-data; name="tel"
    
      13637829200
      ----WebKitFormBoundary7MA4YWxkTrZu0gW
      Content-Disposition: form-data; name="password"
    
      123456
      ----WebKitFormBoundary7MA4YWxkTrZu0gW
    

    x-www-form-urlencoded的优越性就够呛明白了。不过x-www-form-urlencoded不得不传键值对,但是form-data可传二进制

因为url是存被要求行中之。
据此Get与Post区别本质就是是参数是置身请求行面临还是在请求体
本无论用哪种都能放在请求头遭受。一般在呼吁求头中加大有发送端的常量。

有人说:

  • Get是明文,Post隐藏
    活动端不是浏览器,不用https全都是当众。
  • Get传递数据上限XXX
    胡说。有限制的凡浏览器中之url长度,不是Http协议,移动端请求无影响。Http服务器部分来限制的装一下即可。
  • Get中文需要编码
    是真的…要注意。URLEncoder.encode(params, "gbk");

要建议就此post规范参数传递方式。并无什么又可以,只是大家都这么社会更和谐。

点说之是求。下面说响应。
要是键值对,但回到数据我们经常因此Json。
对内存中的组织数据,肯定要就此数据描述语言将目标序列化成文本,再用Http传递,接收端并自文本还原成结构数据。
对象(服务器)<–>文本(Http传输)<–>对象(移动端) 。

服务器返回的数据大部分还是扑朔迷离的结构数据,所以Json最适合。
Json解析库有好多Google的Gson,阿里的FastJson。
Gson的用法看这里。

OkHttp是一个现代,快速,高效之Http
client,支持HTTP/2以及SPDY(SPDY介绍网址:https://zh.wikipedia.org/wiki/SPDY,SPDY(发音如英语:speedy),一种植开放的网络传输协议,由Google付出),它为汝做了广大的事情。

HttpClient & HttpURLConnection

HttpClient早给丢弃了,谁更好这种题材吗只有经历落后的面试官才会问。具体原因可以拘留这里。

下说说HttpURLConnection的用法。
最为开头接触的就是其一。

    public class NetUtils {
        public static String post(String url, String content) {
            HttpURLConnection conn = null;
            try {
                // 创建一个URL对象
                URL mURL = new URL(url);
                // 调用URL的openConnection()方法,获取HttpURLConnection对象
                conn = (HttpURLConnection) mURL.openConnection();

                conn.setRequestMethod("POST");// 设置请求方法为post
                conn.setReadTimeout(5000);// 设置读取超时为5秒
                conn.setConnectTimeout(10000);// 设置连接网络超时为10秒
                conn.setDoOutput(true);// 设置此方法,允许向服务器输出内容

                // post请求的参数
                String data = content;
                // 获得一个输出流,向服务器写数据,默认情况下,系统不允许向服务器输出内容
                OutputStream out = conn.getOutputStream();// 获得一个输出流,向服务器写数据
                out.write(data.getBytes());
                out.flush();
                out.close();

                int responseCode = conn.getResponseCode();// 调用此方法就不必再使用conn.connect()方法
                if (responseCode == 200) {

                    InputStream is = conn.getInputStream();
                    String response = getStringFromInputStream(is);
                    return response;
                } else {
                    throw new NetworkErrorException("response status is "+responseCode);
                }

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (conn != null) {
                    conn.disconnect();// 关闭连接
                }
            }

            return null;
        }

        public static String get(String url) {
            HttpURLConnection conn = null;
            try {
                // 利用string url构建URL对象
                URL mURL = new URL(url);
                conn = (HttpURLConnection) mURL.openConnection();

                conn.setRequestMethod("GET");
                conn.setReadTimeout(5000);
                conn.setConnectTimeout(10000);

                int responseCode = conn.getResponseCode();
                if (responseCode == 200) {

                    InputStream is = conn.getInputStream();
                    String response = getStringFromInputStream(is);
                    return response;
                } else {
                    throw new NetworkErrorException("response status is "+responseCode);
                }

            } catch (Exception e) {
                e.printStackTrace();
            } finally {

                if (conn != null) {
                    conn.disconnect();
                }
            }

            return null;
        }

        private static String getStringFromInputStream(InputStream is)
                throws IOException {
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            // 模板代码 必须熟练
            byte[] buffer = new byte[1024];
            int len = -1;
            while ((len = is.read(buffer)) != -1) {
                os.write(buffer, 0, len);
            }
            is.close();
            String state = os.toString();// 把流中的数据转换成字符串,采用的编码是utf-8(模拟器默认编码)
            os.close();
            return state;
        }
    }

专注网络权限!被坑了小坏。

<uses-permission android:name="android.permission.INTERNET"/>
三级缓存

网上经常说三级缓存--服务器,文件,内存。不过我觉着服务器无到底一级缓存,那就算是数码源嘛。

  • 外存缓存
    首先内存缓存使用LruCache。LRU是Least Recently Used
    近期起码使用算法,这里确定一个尺寸,当Map里对象大小总和超此老时将应用效率低于的目标释放。我以内存大小限制为经过可用内存的1/8.
    内存缓存里读博的数目就直回到,读不交的为硬盘缓存要数。

  • 硬盘缓存
    硬盘缓存使用DiskLruCache。这个类似非以API中。得复制利用。
    瞧见LRU就亮了吧。我用硬盘缓存大小设置为100M。

      @Override
      public void putBitmap(String url, Bitmap bitmap) {
          put(url, bitmap);
          //向内存Lru缓存存放数据时,主动放进硬盘缓存里
          try {
              Editor editor = mDiskLruCache.edit(hashKeyForDisk(url));
              bitmap.compress(Bitmap.CompressFormat.JPEG, 100, editor.newOutputStream(0));
              editor.commit();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
    
      //当内存Lru缓存中没有所需数据时,调用创造。
      @Override
      protected Bitmap create(String url) {
          //获取key
          String key = hashKeyForDisk(url);
          //从硬盘读取数据
          Bitmap bitmap = null;
          try {
              DiskLruCache.Snapshot snapShot = mDiskLruCache.get(key);
              if(snapShot!=null){
                  bitmap = BitmapFactory.decodeStream(snapShot.getInputStream(0));
              }
          } catch (IOException e) {
              e.printStackTrace();
          }
          return bitmap;
      }
    

    DiskLruCache的原理不再说了(我还缓解了其有的一个BUG,向Log中加上的数据增删记录时,最后一长达没有出口,导致最终一长长的缓存一直失效。)

  • 硬盘缓存也从没数据就归空,然后就于服务器请求数据。

随即虽是整整流程。
唯独自身这么的处理方案要发生很多受制。

  • 图未经压缩处理直接存储使用
  • 文件操作以主线程
  • 莫健全之图处理API

以前为认为这么就够好直到我遇见下面俩。

HttpURLConnection是同样栽多用、轻量极的HTTP客户端,使用其来开展HTTP操作可以适用于大部分之应用程序。虽然HttpURLConnection的API提供的比较简单,但是同时立即吗让我们可以进一步容易地失去行使及壮大其。

HTTP请求&响应

既然如此说由入门级开始就是说说Http请求包的构造。
一律涂鸦呼吁虽是朝着目标服务器发送一拧文本。什么样的文件?有下面结构的文件。
HTTP请求保管结构

请求包

例子:

    POST /meme.php/home/user/login HTTP/1.1
    Host: 114.215.86.90
    Cache-Control: no-cache
    Postman-Token: bd243d6b-da03-902f-0a2c-8e9377f6f6ed
    Content-Type: application/x-www-form-urlencoded

    tel=13637829200&password=123456

求了就算见面吸纳响应包(如果对面有HTTP服务器)
HTTP响应包结构

响应包

例子:

    HTTP/1.1 200 OK
    Date: Sat, 02 Jan 2016 13:20:55 GMT
    Server: Apache/2.4.6 (CentOS) PHP/5.6.14
    X-Powered-By: PHP/5.6.14
    Content-Length: 78
    Keep-Alive: timeout=5, max=100
    Connection: Keep-Alive
    Content-Type: application/json; charset=utf-8

    {"status":202,"info":"\u6b64\u7528\u6237\u4e0d\u5b58\u5728\uff01","data":null}

Http请求方式发出

方法 描述
GET 请求指定url的数据,请求体为空(例如打开网页)。
POST 请求指定url的数据,同时传递参数(在请求体中)。
HEAD 类似于get请求,只不过返回的响应体为空,用于获取响应头。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。

常用只有Post与Get。

HttpClient & HttpURLConnection

HttpClient早被抛弃了,谁又好这种问题呢惟有经历落后的面试官才会咨询。具体由可以拘留这里。

下面说说HttpURLConnection的用法。
太开始接触的即是这个。

    public class NetUtils {
        public static String post(String url, String content) {
            HttpURLConnection conn = null;
            try {
                // 创建一个URL对象
                URL mURL = new URL(url);
                // 调用URL的openConnection()方法,获取HttpURLConnection对象
                conn = (HttpURLConnection) mURL.openConnection();

                conn.setRequestMethod("POST");// 设置请求方法为post
                conn.setReadTimeout(5000);// 设置读取超时为5秒
                conn.setConnectTimeout(10000);// 设置连接网络超时为10秒
                conn.setDoOutput(true);// 设置此方法,允许向服务器输出内容

                // post请求的参数
                String data = content;
                // 获得一个输出流,向服务器写数据,默认情况下,系统不允许向服务器输出内容
                OutputStream out = conn.getOutputStream();// 获得一个输出流,向服务器写数据
                out.write(data.getBytes());
                out.flush();
                out.close();

                int responseCode = conn.getResponseCode();// 调用此方法就不必再使用conn.connect()方法
                if (responseCode == 200) {

                    InputStream is = conn.getInputStream();
                    String response = getStringFromInputStream(is);
                    return response;
                } else {
                    throw new NetworkErrorException("response status is "+responseCode);
                }

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (conn != null) {
                    conn.disconnect();// 关闭连接
                }
            }

            return null;
        }

        public static String get(String url) {
            HttpURLConnection conn = null;
            try {
                // 利用string url构建URL对象
                URL mURL = new URL(url);
                conn = (HttpURLConnection) mURL.openConnection();

                conn.setRequestMethod("GET");
                conn.setReadTimeout(5000);
                conn.setConnectTimeout(10000);

                int responseCode = conn.getResponseCode();
                if (responseCode == 200) {

                    InputStream is = conn.getInputStream();
                    String response = getStringFromInputStream(is);
                    return response;
                } else {
                    throw new NetworkErrorException("response status is "+responseCode);
                }

            } catch (Exception e) {
                e.printStackTrace();
            } finally {

                if (conn != null) {
                    conn.disconnect();
                }
            }

            return null;
        }

        private static String getStringFromInputStream(InputStream is)
                throws IOException {
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            // 模板代码 必须熟练
            byte[] buffer = new byte[1024];
            int len = -1;
            while ((len = is.read(buffer)) != -1) {
                os.write(buffer, 0, len);
            }
            is.close();
            String state = os.toString();// 把流中的数据转换成字符串,采用的编码是utf-8(模拟器默认编码)
            os.close();
            return state;
        }
    }

留神网络权限!被坑了多少次。

<uses-permission android:name="android.permission.INTERNET"/>

Volley CookieSession:

图形管理方案

更何况说图片存储。不要在好服务器上面,徒增流量压力,还无图处理效果。
推荐七牛与阿里云存储(没因此了其他
π__π
)。它们还有充分重大之一模一样项图片处理。在图Url上添加参数来对图纸进行部分处理又传。
于是乎(七牛之拍卖代码)

    public static String getSmallImage(String image){
        if (image==null)return null;
        if (isQiniuAddress(image)) image+="?imageView2/0/w/"+IMAGE_SIZE_SMALL;
        return image;
    }

    public static String getLargeImage(String image){
        if (image==null)return null;
        if (isQiniuAddress(image)) image+="?imageView2/0/w/"+IMAGE_SIZE_LARGE;
        return image;
    }

    public static String getSizeImage(String image,int width){
        if (image==null)return null;
        if (isQiniuAddress(image)) image+="?imageView2/0/w/"+width;
        return image;
    }

既然如此可加速请求速度,又能够减小流量。再配合Fresco或Glide。完美的图加载方案。
但是当下就得您把有图片都存放于七牛要阿里云,这样吗不利。

图表/文件上传也还是以它第三在存储,它们都生SDK与法定文档教你。
但图片一定要缩减了后上传。上传1-2M大的高清照片没有意义。

Volley&OkHttp

Volley&OkHttp应该是本最常用的大网要求库。用法也特别相似。都是故构造请求在请求队列的艺术管理网络请求。

先说Volley:
Volley可以经这个库展开依赖.
Volley在Android 2.3跟以上版本,使用的是HttpURLConnection,而当Android
2.2及以下版本,使用的是HttpClient。
Volley的中心用法,网上资料无数,这里推荐郭霖大神的博客
Volley存在一个缓存线程,一个网络请求线程池(默认4单线程)。
Volley这样直接用支出效率会于低,我以自我动用Volley时的各种技能封装成了一个仓房RequestVolly.
自以是库房中将构造请求的方法封装为了函数式调用。维持一个大局的恳求队列,拓展一些有益的API。

不过再怎么封装Volley在力量拓展性上始终无法与OkHttp相比。
Volley停止了履新,而OkHttp得到了合法的肯定,并在不断优化。
故自最后替换为OkHttp

OkHttp用法见这里
非常和睦之API与详尽的文档。
当即首文章为写的百般详细了。
OkHttp使用Okio拓展数据传。都是Square家的。
可连无是一直用OkHttp。Square公司还出了一个Retrofit库配合OkHttp战斗力翻倍。

Volley√√√Ok√√

同步&异步

立2个概念就存在让多线程编程中。
android中默认只来一个主线程,也深受UI线程。因为View绘制只能在是线程内进行。
之所以若你死了(某些操作而这个线程在此处运行了N秒)这个线程,这里面View绘制将非可知开展,UI就见面卡。所以如果使劲避免以UI线程进行耗时操作。
纱要是一个卓越耗时操作。
由此地方的Utils类进行网络要单发生一行代码。

NetUtils.get("http://www.baidu.com");//这行代码将执行几百毫秒。

苟你这样描绘

        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String response = Utils.get("http://www.baidu.com");
    }

就会死。。
就就是是手拉手方式。直接耗时操作阻塞线程直到数据接受了毕然后回。Android不允许的。
异步方式:

         //在主线程new的Handler,就会在主线程进行后续处理。
    private Handler handler = new Handler();
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.text);
        new Thread(new Runnable() {
            @Override
            public void run() {
                    //从网络获取数据
                final String response = NetUtils.get("http://www.baidu.com");
                    //向Handler发送处理操作
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                            //在UI线程更新UI
                        textView.setText(response);
                    }
                });
            }
        }).start();
    }

以子线程进行耗时操作,完成后通过Handler将更新UI的操作发送至主线程执行。这就吃异步。Handler是一个Android线程模型中要之东西,与网络无关便不说了。关于Handler不了解就先失Google一下。
有关Handler原理同首对的篇章

而诸如此类描绘好丢人。异步通常伴随者他的好基友回调
立是透过回调封装的Utils类。

    public class AsynNetUtils {
        public interface Callback{
            void onResponse(String response);
        }

        public static void get(final String url, final Callback callback){
            final Handler handler = new Handler();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    final String response = NetUtils.get(url);
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onResponse(response);
                        }
                    });
                }
            }).start();
        }

        public static void post(final String url, final String content, final Callback callback){
            final Handler handler = new Handler();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    final String response = NetUtils.post(url,content);
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onResponse(response);
                        }
                    });
                }
            }).start();
        }
    }

下一场使办法。

    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.webview);
        AsynNetUtils.get("http://www.baidu.com", new AsynNetUtils.Callback() {
            @Override
            public void onResponse(String response) {
                textView.setText(response);
            }
        });

凡是勿是优雅很多。
哦,一个傻到哭的网络要方案成型了。
懵的地方产生许多:

  • 每次都new Thread,new Handler消耗了特别
  • 没有异常处理体制
  • 未曾缓存机制
  • 无完善之API(请求头,参数,编码,拦截器等)与调试模式
  • 没有Https

Fresco&Glide

莫用想吧领略其都做了非常完美之优化,重复过去轮子的表现充分愚蠢。
Fresco凡是Facebook公司的越轨科技。光看成效介绍就看非常强大。使用方法官方博客说之十足详细了。
当真三级缓存,变换后底BItmap(内存),变换前的固有图片(内存),硬盘缓存。
以内存管理上落成了最为。对于重度图片采取的APP应该是挺好之。
她一般是一直行使SimpleDraweeView来替换ImageView,呃~侵入性较强,依赖上它apk包直接生1M。代码量惊人。

故而我再爱Glide,作者是bumptech。这个库房被普遍的利用在google的开源项目遭到,包括2014年google
I/O大会上宣布的官方app。
这里有详实介绍。直接动用ImageView即可,无需初始化,极简的API,丰富的拓展,链式调用都是自爱不释手的。
添加的进行指的即是这个。
除此以外我吧为此过Picasso。API与Glide简直一型一样,功能略少,且发生一半年无修复的BUG。

误差说明:第三正在软件计算,受后台应用影响,存在一定误差。

纱图片加载优化

于图片的传输,就像面的报到接口的avatar字段,并无见面一直将图纸写于回来内容里,而是给一个图片的地点。需要经常再也失加载。

苟您一直用HttpURLConnection去取得一摆放图,你办获得,不过尚未优化就单是单BUG不断demo。绝对不可知正式以。
小心网络图片有些特点:

  1. 其永远不会见转移
    一个链接对应之图形一般永远不见面转换,所以当第一不成加载了图片时,就应与永久缓存,以后就不再网要。
  2. 她不行占内存
    同等摆图片小之几十k多的几M高清无码。尺寸为是64*64及2k图。你不克便如此直白展示到UI,甚至不能够直接放大上内存。
  3. 她若加载很遥远
    加载一布置图需要几百ms到几乎m。这之间的UI占位图功能也是得考虑的。

说说自以上头提到的RequestVolley里召开的图形请处理(没错我开了,这一部分底代码可以错过github里看源码)。

Volley以同样起来创办请求队列的经过被,需要创造网络线程和缓存线程,同时还待初始化基于Disk的缓存,这中产生雅量的资源开发和IO操作,所有才会慢。

•     上传下载的快回调

测试环境:直连下wifi访问

专程指出的是,在 Froyo(2.2)之前,HttpURLConnection有只关键
Bug,调用close()函数会潜移默化连接池,导致连日复用失效,所以当 Froyo
之前用HttpURLConnection需要关闭keepAlive。

OkHttp√√√Ok√√

3、OkHttp:是一个针锋相对成熟之缓解方案,我们重发出理由相信OkHttp的无敌。

只是当Android
2.2本之前,HttpURLConnection一直有着一些叫人讨厌的bug。比如说对一个可是读之InputStream调用close()方法时,就发出或会见招致连接池失效了。那么我们便的解决办法就是直接禁用掉连接池的效益:

唯独更怎么封装Volley在职能拓展性上一味无法同OkHttp相比。

http://hw1287789687.iteye.com/blog/2240085

Volley存在一个缓存线程,一个网络请求线程池(默认4独线程)。

http://zzc1684.iteye.com/blog/2162858

1、网络发送流量HttpURLConnection最高,Volley次之,OKHttp第三号,HttpClient最少。但是,数据量差别不甚,零点几的请差别。

7、支持请求回调

•     支持取消某个请求

3、电量

1、连接复用节省连接起时间,如被keep-alive

自我在是库房中将构造请求的计封装为了函数式调用。维持一个大局的请队列,拓展一些便于的API。

误差说明:网络的场面或会见影响网络要时。

综上得出最终定论:

纱要框架支持之功能:

误差说明:网络要的殡葬和接到流量在必然误差。

Apache
HttpClient早便无推荐httpclient,5.0后干脆废弃,后续会去。6.0删减了HttpClient。Java开发用HttpClient,官方推荐Android开发用HttpUrlConnection。

骨子里现在嘛,两者都无须,就因故Okhttp

HttpClient√√√Ok√

谷歌自己为是引进用HttpUrlConnection,对她进行了大量的优化,这个自安卓之相助文档可以看出来:

1、重试机制

http://developer.android.com/reference/java/net/HttpURLConnection.html

Volley可以说凡是将AsyncHttpClient和Universal-Image-Loader的长集吃了同一套,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可像Universal-Image-Loader一样自在加载网络上的图样。除了简单易用之外,Volley在性能方面为展开了老大幅面的调整,它的计划性目标就是是非常适合去开展数据量不慌,但通信频繁的大网操作,而对此大数据量的网操作,比如说下载文件等,Volley的显现即会见异常不好

误差说明:第三方软件计算,受后台应用影响,存在必然误差。

设置请求Cookie

误差说明:第三正软件计算,受后台应用影响,存在必然误差。

重复长HttpURLConnection本身API相对简单,所以对Android来说,在2.3自此建议使用HttpURLConnection,之前建议使用HttpClient。

http://p.codekk.com/blogs/detail/54cfab086c4761e5001b2542

Volley的独到之处很多,可进行、结构合理、逻辑清晰、能辨识缓存、通过合之法门,获取网络数据,包括且无压制文本、图片等资源。用了一段时间,果断放弃以前用过之任何框架。

3、OkHttp亮点于多

√√Ok√

https://segmentfault.com/a/1190000004345545

Volley源码解析:

•     支持于签署网站https的走访,提供方设置下证件就推行

每当3.0晚和4.0饱受都进行了改进,如针对HTTPS的支持

2、HttpURLConnection

Volley是一个简化网络任务之堆栈。他负担处理要,加载,缓存,线程,同步等问题。它好拍卖JSON,图片,缓存,文本源,支持一定程度之自定义。

http://blog.csdn.net/weborn/article/details/9112309

正如的指标:

自动管理Cookie

高效稳定,但是保护成本高昂,故android
开发组织不愿意当保障该库而是转投更为便捷的HttpUrlConnection。

2、对于已成熟之采用,Volley停止了更新,而OkHttp得到了合法的肯定,并于时时刻刻优化。

意义对比表格参考的博客:

2、流量

HttpClient Cookie:

8、弱网性能及稳定

另外,在 Gingerbread(2.3) HttpURLConnection 默认开启了 gzip 压缩,提高了
HTTPS 的属性,Ice Cream Sandwich(4.0) HttpURLConnection
支持了请求结果缓存。

•     支持session的保持

假设你的服务器配置了差不多单IP地址,当第一只IP连接失败的时光,OkHttp会自动品下一个IP。

OkHttp是一个Java的HTTP+SPDY客户端开发包,同时为支撑Android。需要Android
2.3之上

2、内存消耗

缓存响应避免再次的大网要

1、HttpClient:以Android
2.2本子之前,HttpClient拥有比少的bug,因此采取它们是无与伦比好之选项。

测试结果算:测试3次。

1、CPU占用

4种艺术的于:

结论:测试机型完全上内存占用情况,在小米手机上,OkHttp的大网要消耗内存略低于其它联网方式。在魅族手机上,内存消耗多少高于其它方式。显示有测试机型内存消耗表现各异。

OkHttp使用Okio开展多少传。都是Square家的。

3、支持文件及污染与下载

•     基于Http的文本及污染

•     支持请求回调,直接返回对象、对象集合

4、可以加载图片

OkHttp使用Okio来大大简化数据的造访和储存,Okio凡是一个加强
java.io 和 java.nio的仓库。

Volley的骨干用法,网上资料无数,这里推荐郭霖大神的博客

1、对于新的应用程序,应该更偏向于以HttpURLConnection盖以今后的干活中Google也会见以还多之岁月放在优化HttpURLConnection上面。

Volley这样直接用支付效率会比低,我以自己下Volley时之各种技能封装成了一个仓库RequestVolly.

•     加载图片

Volley提供了:JsonObjectRequest、JsonArrayRequest、StringRequest、ImageRequest、NetworkImageView等Request形式。

默认情况下,OKHttp会自动处理大规模的网络问题,像二差连续、SSL的拉手问题。

HttpUrlConnection

http://my.oschina.net/liusicong/blog/361853

7、cookie支持session  id会话支持

•     一般的get请求

当android
2.2以及以下版本中HttpUrlConnection存在着有bug,所以建议以android
2.3自此使用HttpUrlConnection,2.3事先以HttpClient。

怎么要召开缓存,或者说生啊便宜?

DefaultHttpClient和它们的哥们儿AndroidHttpClient都是HttpClient具体的实现类似,它们都存有多的API,而且实现比较稳定,bug数量也大少。

HttpClient 重试机制:

3、电量消耗

每当4.0负,还增加了针对性缓存的支持

OkHttp还处理了代理服务器问题及SSL握手失败问题。

10、适配各种机型、4.4与前面版本  2.3  4.1 5.0

敲定:OkHttp的网络要消耗的电量百分比在小低于其它联网方式,消耗的总电量在小米手机上超越其他联网方式,在魅族手机及稍稍小于其他联网方式。消耗电量的区别不坏,在0.5mah以内。

OkHttp实现之无数术使:连接池,gziping,缓存等就是知网络有关的操作是何其繁杂了。

在Android
4.0本被,我们同时加加了一部分应的缓存机制。当缓存被安装后(调用HttpResponseCache的install()方法),所有的HTTP请求都见面满足以下三种植情况:

OkHttp
处理了很多网疑难杂症:会从众多常用之连问题遭到自行回复。如果你的服务器配置了多只IP地址,当第一独IP连接失败的时刻,OkHttp会自动品下一个IP。

Volley停止了翻新,而OkHttp得到了官的确认,并当不断优化。因此自最终替换为OkHttp

要是您的应用程序中集成了OKHttp,Retrofit默认会使用OKHttp处理其他网络层请求。

5、支持多任务网络要操做

较轻便,灵活,易于扩展

5、是否支持reflect api,OkHttp有配套措施

http://developer.android.com/reference/java/net/HttpURLConnection.html

谷歌自己呢是援引用HttpUrlConnection,对她进行了汪洋底优化,这个起安卓的鼎力相助文档可以看下:

1、HttpClient  缺点罗列

Ps:稳定性:季栽网络连接方式都当正式广泛应用,都比较稳定。

4、流量消耗

测试手机:小米MI3(4.4.4)、魅蓝2(5.1)

OkHttp还处理了代理服务器问题及SSL握手失败问题。

Volley在Android 2.3和以上版本,使用的是HttpURLConnection,而于Android
2.2同以下版本,使用的凡HttpClient。

从Android4.4开头HttpURLConnection的底层实现采用的凡okHttp

结论:网络要平均耗时HttpClient最特别,HttpURLConnection最小,Volley平均较前者高10ms~20ms,OkHttp比Volley高20ms~40ms。

复杂的复苏存策略会基于用户眼前底纱状态以两样之休养存策略,比如当2g网络特别不同的状态下,提高缓存使用的光阴;不用的施用、业务要求、接口所要之复苏存策略也会见不等同,有的要保证数据的实时性,所以不能够发生缓存,有的你得缓存5分钟,等等。你只要因具体情况所急需数的时效性情况为有不同的方案。当然你呢得以尽且一律的苏存策略,看君自己。

5、联网平均耗时

对于新的应用程序应该尤其偏向于下HttpURLConnection因以其后的行事当中我们呢会见以还多之时光放在优化HttpURLConnection上面。

6、支持缓存

8、支持session的保持

OkHttp Cookie管理:

5、联网时间

Android4.4的源码中可见到HttpURLConnection已经替换成OkHttp实现了。

4、Volley

OKHttp是Android版Http客户端。非常便捷,支持SPDY、连接池、GZIP和 HTTP
缓存。

OkHttp实现了几跟java.net.HttpURLConnection一样的API。

时下,该包裹库志支持:

参考博客:

4、内存占用

测试方法:安装并拉开易测APP,安装网络框架apk,进行联网请求(http://www.csdn.net/),请求多次进行测试。

2、支持Http的为主要方法:GET、POST

HttpURLConnection设置请求Cookie:

误差说明:第三在软件计算,受后台应用影响,存在一定误差。

3、易用性

http://blog.csdn.net/zhangcanyan/article/details/51661448

使 OkHttp 无需另行写你程序中的纱代码。

2、提供的恢宏功能

网络优化建议点:

OKHttp是Android版Http客户端。非常快速,支持SPDY、连接池、GZIP和HTTP缓存。

4、是否https

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0106/2275.html

而还要也是因为HttpClient的API数量过多,使得我们死为难在非损坏兼容性的情下对它进行升级和扩展,所以,目前Android团队于晋级与优化HttpClient方面的工作态度并无主动。

Volley是吧RPC网络操作而计划之,适用于小操作。

功能点:

OkHttp扮演着传输层的角色。

今天的底实现即是经过Okhttp

之所以我建议以OkHttp,现在新型稳定版啊3.2.0

但是连无是直用OkHttp。Square公司还来了一个Retrofit库配合OkHttp战斗力翻倍。

削减服务器负荷,降低延迟晋升用户体验。

2、累积接收流量HttpClient最深,HttpURLConnection和Volley相同,OkHttp略大于前两者。

结论:

1、支持从定义请求的Header

1、cpu

6、缓存、重试

敲定:测试机型完全达标CPU占用率,OkHttp的大网要略小于其它联网方式。

无异于、性能指标对比

4栽网络连接方式供的意义对比表格:

HttpURLConnectionPOST  ×

•     一般的post请求

Volley可以轻松设置OkHttp作为其传输层。

2、HttpURlConnection:设于Android
2.3本子和之后,HttpURLConnection则是最佳的选。它的API简单,体积比较小,因而特别适用于Android项目。

支撑SPDY,可以统一多独及与一个主机的呼吁

Volley默认在Froyo上行使Apache
Http stack作为那个传输层,在Gingerbread及以后的版及用HttpURLConnection stack作为传输层。原因是在不同的安卓版中就简单种植http
stack各自在有题目。

•     文件下充斥

纱加载库:Picasso、Fresco,所以自己还欣赏Glide

2、不用域名,用IP直连省去DNS解析过程,根据域名得到IP地址

9、超时时间,几种过时间   连接超时,响应超时

可本主流的大网要都是因此Volley,OkHttp呼声也蛮高。

相关文章