HttpClient与HttpUrlConnection下载速度的对比分析

Android有两套http的API,刚开始使用网络编程时多少有些迷惑到底用哪个好呢?其实孰优孰劣无需再争论,google已经指出HttpUrlConnection是Android更优的选择,并在SDK文档中引用了博客(需要代理访问)http://android-developers.blogspot.com/2011/09/androids-http-clients.html来阐述各自的优缺点。国内也有些博客大致翻译了上面的内容,并对了一些测试,可惜测试不严密,某博客甚至得出HttpUrlConnection的下载速度快几倍的结论,其实并没有公平反映出二者的下载速度。

虽然我已经使用过HttpUrlConnection实现了一个轻量级http引擎用于下载,但是好奇心还是促使我写了一个测试程序用于比较二者的性能。由于HttpClient仅仅是一个接口,所以我选用了其实现类DefaultHttpClient和HttpUrlConnection做比较,方法很简单,分别下载同一个文件10次,然后计算耗时的平均值,测试代码片段如下:

@Override
    public void onClick(View v)
    {
        if (v.equals(mTestHttpClientBtn))
        {
            new Thread(new Runnable()
            {
                @Override
                public void run()
                {
                    long averageTime = 0;
                    for (int i = 0; i < 10; i++)
                    {
                        File file = new File(getFilesDir(), String.valueOf(i) + ".file");
                        FileOutputStream fileOutputStream = null;
                        try
                        {
                            fileOutputStream = new FileOutputStream(file);
                        }
                        catch (FileNotFoundException e)
                        {
                            Log.e(TAG, "", e);
                            return;
                        }

                        long startTime = System.currentTimeMillis();
                        testHttpClient(fileOutputStream);
                        long stopTime = System.currentTimeMillis();

                        averageTime += stopTime - startTime;
                    }
                    averageTime /= 10;

                    // 测试完成
                    Message msg = new Message();
                    msg.what = MSG_TEST_HTTP_CLIENT_DONE;
                    msg.obj = averageTime;
                    mHandler.sendMessage(msg);
                }
            }).start();

            return;
        }

        if (v.equals(mTestHttpUrlConnectionBtn))
        {
            new Thread(new Runnable()
            {
                @Override
                public void run()
                {
                    long averageTime = 0;
                    for (int i = 0; i < 10; i++)
                    {
                        File file = new File(getFilesDir(), String.valueOf(i + 10) + ".file");
                        FileOutputStream fileOutputStream = null;
                        try
                        {
                            fileOutputStream = new FileOutputStream(file);
                        }
                        catch (FileNotFoundException e)
                        {
                            Log.e(TAG, "", e);
                            return;
                        }

                        long startTime = System.currentTimeMillis();
                        testHttpUrlConnection(fileOutputStream);
                        long stopTime = System.currentTimeMillis();

                        averageTime += stopTime - startTime;
                    }
                    averageTime /= 10;

                    // 测试完成
					// 返回栏目页:http://www.bianceng.cnhttp://www.bianceng.cn/OS/extra/
                    Message msg = new Message();
                    msg.what = MSG_TEST_HTTP_URL_CONNECTION_DONE;
                    msg.obj = averageTime;
                    mHandler.sendMessage(msg);
                }
            }).start();

            return;
        }
    }

    private void testHttpClient(FileOutputStream fileOutputStream)
    {
        DefaultHttpClient httpClient = new DefaultHttpClient();

        HttpEntity entity = null;
        InputStream inputStream = null;
        try
        {
            HttpGet httpGet = new HttpGet(TEST_URL);
            HttpResponse httpResponse = httpClient.execute(httpGet);

            StatusLine statusLine = httpResponse.getStatusLine();
            if (statusLine == null)
            {
                throw new Exception("no status line !!!");
            }
            int responseCode = statusLine.getStatusCode();
            if (responseCode < 200 || responseCode >= 300)
            {
                throw new Exception("response error !!!");
            }
            entity = httpResponse.getEntity();
            if (entity == null)
            {
                throw new Exception("no entity !!!");
            }
            inputStream = entity.getContent();
            int bytesRead = -1;
            byte[] buffer = new byte[4096];
            while ((bytesRead = inputStream.read(buffer)) != -1)
            {
                fileOutputStream.write(buffer, 0, bytesRead);
            }
        }
        catch (Exception e)
        {
            Log.e(TAG, "", e);
        }
        finally
        {
            try
            {
                if (inputStream != null)
                {
                    inputStream.close();
                }

                if (entity != null)
                {
                    entity.consumeContent();
                }

                if (fileOutputStream != null)
                {
                    fileOutputStream.flush();
                    fileOutputStream.close();
                }
            }
            catch (Exception e)
            {
                Log.e(TAG, "", e);
            }
        }
    }

    private void testHttpUrlConnection(FileOutputStream fileOutputStream)
    {
        HttpURLConnection httpURLConnection = null;
        InputStream inputStream = null;
        try
        {
            httpURLConnection = (HttpURLConnection) new URL(TEST_URL).openConnection();
            httpURLConnection.setRequestMethod("GET");
            httpURLConnection.connect();

            int responseCode = httpURLConnection.getResponseCode();
            if (responseCode < 200 || responseCode >= 300)
            {
                throw new Exception("response error !!!");
            }
            inputStream = httpURLConnection.getInputStream();
            int bytesRead = -1;
            byte[] buffer = new byte[4096];
            while ((bytesRead = inputStream.read(buffer)) != -1)
            {
                fileOutputStream.write(buffer, 0, bytesRead);
            }
        }
        catch (Exception e)
        {
            Log.e(TAG, "", e);
        }
        finally
        {
            try
            {
                if (inputStream != null)
                {
                    inputStream.close();
                }

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

                if (fileOutputStream != null)
                {
                    fileOutputStream.flush();
                    fileOutputStream.close();
                }
            }
            catch (Exception e)
            {
                Log.e(TAG, "", e);
            }
        }
    }

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索exception
, new
, httpurlconnection
, null
, inputstream
, fileoutputstream
, inputStream.read()
HttpURLConnection类
peerconnectionclient、httpclientconnection、httpurlconnection、urlconnection、urlconnection post,以便于您获取更多的相关知识。

时间: 2024-11-03 07:49:09

HttpClient与HttpUrlConnection下载速度的对比分析的相关文章

Ajax中解析Json的两种方法对比分析

  这里给大家介绍的是Ajax中解析Json的两种方法对比分析,十分的实用,本文为学习笔记,属新手文章,欢迎指教! eval(); //此方法不推荐 JSON.parse(); //推荐方法 一.两种方法的区别 我们先初始化一个json格式的对象: ? 1 2 3 4 5 var jsonDate = '{ "name":"周星驰","age":23 }'   var jsonObj = eval( '(' + jsonDate + ')' );

新浪搜狐网易腾讯iPhone手机微博对比分析

文章描述:新浪搜狐网易腾讯iPhone手机微博对比分析. 一.登陆页(以下图片顺序均为新浪微.腾讯.搜狐.网易) 微博登录界面(新浪.腾讯) 微博登录界面(搜狐.网易) 四款iphone微博客户端从页面上看,只有网易和腾讯的支持记住用户名和密码,实际操作后就会发现,其实大家都是默认记录的.并且新浪微博支持多账户切换,默认记录为最后一个登陆的用户.外观上,除了新浪微博客户端增加了"微博广场"的内容推广对新用户有写引导以外,其他三家基本相同. 新浪微博支持多帐户切换 多贴一张新浪的多账户切

对比分析垃圾站和正规站SEO优化的异同之处

刚接触做站的站长总是很容易纠结于一个问题,那就是到底是做正规站好还是做垃圾站好?似乎让人们比较容易接受的就是垃圾站的"寿命"总是长不过正规站,但又不得不承认做垃圾站能够更快地赚到钱,只要你的SEO优化技术到位.但一旦随着我们做站经历和经验的增长,这样的心态便会很快地消失,因为只要你做的站不违法,垃圾站确实是做站赢利的一条相对"捷径",而正规站更是值得站长长久发展的志向所在,如何让两种站都赢利才是作为站长最应该关心的问题. 无论做垃圾站,抑或是正规站,要想让网站获得较

北京seo:团购行业的两个案例对比分析

团购(B2T)行业2010年的新产物,现在已经迅速在全国各大城市成熟起来,成为众多消费者追求的一种现代流行.时尚的购物方式,因为它有效的防止了不成熟市场的暴利.个人消费的盲目.抵制了大众消费的泡沫.目前拉手网,G团网,美团,懒人团购网,团宝网,QQ团,大众点评团,糯米团等团购网站占尽很大的市场.而其它的团购网站也纷纷揭竿,来抢这一块市场. 今天北京seo对团800和我是团长这两个网站进行对比分析,主要是给朋友分析的,在这里也分享给各位朋友. 一.两个网站的友情链接对比: 1.团800友情链接页面

php中数据库连接方式pdo和mysqli对比分析

 这篇文章主要介绍了php中数据库连接方式pdo和mysqli从各个方面进行了对比分析,十分全面,这里推荐给大家,有需要的小伙伴来参考下.     1)总的比较     PDO MySQLi 数据库支持 12种不同的数据库支持 支持MySQL API OOP OOP + 过程 Connection Easy Easy 命名参数 支持 不支持 对象映射支持 支持 支持 预处理语句 (客户端) 支持 不支持 性能 快 快 支持存储过程 支持 支持 2 连接方式 先来看下两者连接数据库的方式:   代

javascript中call,apply,bind的用法对比分析

 这篇文章主要给大家对比分析了javascript中call,apply,bind三个函数的用法,非常的详细,这里推荐给小伙伴们.     关于call,apply,bind这三个函数的用法,是学习javascript这门语言无法越过的知识点.下边我就来好好总结一下它们三者各自的用法,及常见的应用场景. 首先看call这个函数,可以理解成"借用","请求".想像一下如下的情景:你孤单一人漂泊在外,有急事想往家里打电话,可是很不巧,手机欠费了,或者没电了,或者掉坑里了

高票房的《致青春》《钢铁侠3》营销点对比分析

五月的天是火热的,五月的电影营销也同样火热.赵薇的导演处女作<致我们终将逝去的青春>(以下笔者就简称<致青春>)和好莱坞大片<钢铁侠3>真可谓赚足了眼球.光是票房纪录这块估计都已经让光线传媒和DMG这两家公司喜笑颜开,但是这两部影片的上映前后的营销工作也异常激烈.那么笔者就来对比分析这两部在内地如此卖座的电影一些营销点. 先来看一下两部影片的辉煌战绩: <钢铁侠3>:首日上映便连创4项内地影视票房记录---首日票房冠军(之前是<变形金刚3>1.1

ArrayList和LinkedList的几种循环遍历方式及性能对比分析

主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以了解(1)List的五种遍历方式及各自性能 (2)foreach及Iterator的实现 (3)加深对ArrayList和LinkedList实现的了解. 阅读本文前希望你已经了解ArrayList顺序存储和LinkedList链式的结构,本文不对此进行介绍. 相关:HashMap循环遍历方式及其性

H5、React Native、Native应用对比分析

每日更新关注:http://weibo.com/hanjunqiang  新浪微博!iOS开发者交流QQ群: 446310206 "存在即合理".凡是存在的,都是合乎规律的.任何新事物的产生总要的它的道理:任何新事物的发展总是有着取代旧事物的能力.React Native来的正是时候,一则是因为H5发展到一定程度的受限:二则是移动市场的迅速崛起强调团队快速响应和迭代:三则是用户的体验被放大,用户要求极致的快感,除非你牛x(例如:12306最近修改手机号需要用户自己发短信接收验证码).