okHttp、Glide和HttpURLConnection下载图片并保存所需时间对比

背景

  需要实现下载壁纸到手机应用里,面向“百度”编程,通过查找知道可以使用okhttp、glide或者HttpURLConnection下载图片。又发现glide下载图片很快(后面发现是因为下载的同一张图片,glide有缓存,所以很快)。于是就写了程序想对3种下载方式快慢进行比较并记录.

准备

  界面有4个按钮,其中3个对应三种下载方式,最后1个按钮删除已经下载过的文件。

思路

  在子线程中运行,并下载图片,将其保存在data/data下。

代码

按钮点击事件

 @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.okhttpButton:
                new Thread(() -> {
                    long startTime = System.currentTimeMillis(); //获取开始时间
                    try {
                        Bitmap bitmap = downloadByOkhttp(url);
                        onSaveBitmap(bitmap,this,"img_1.jpeg");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    long endTime = System.currentTimeMillis(); //获取结束时间
                    Log.d(TAG, "okhttp 下载时间:" + (endTime - startTime) + "ms");

                }).start();
                break;
            case R.id.glideButton:
                new Thread(()->{
                    long startTime = System.currentTimeMillis(); //获取开始时间
                    try {
                        Bitmap bitmap  =Glide.with(this)
                                .asBitmap()
                                .load(url)
                                .submit()
                                .get();
                        onSaveBitmap(bitmap,this,"img_2.jpeg");
                    } catch (ExecutionException e) {
                        e.printStackTrace();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    long endTime = System.currentTimeMillis(); //获取结束时间
                    Log.d(TAG, "glide 下载时间:" + (endTime - startTime) + "ms");
                }).start();
                break;
            case R.id.httpGetButton:
                new Thread(()->{
                    long startTime = System.currentTimeMillis(); //获取开始时间
                    Bitmap bitmap = downloadByHttp(url);
                    onSaveBitmap(bitmap,this,"img_3.jpeg");

                    long endTime = System.currentTimeMillis(); //获取结束时间
                    Log.d(TAG, "httpGet 下载时间:" + (endTime - startTime) + "ms");
                }).start();
                break;
            case R.id.deleteBtn:
                File file_file = new File("/data/data/com.example.myapplication/files");
                deleteFolder(file_file);
                break;

            default:
                break;
        }
    }

删除图片

    public  void deleteFolder(File file) {
        if (!file.exists())
            return;

        if (file.isDirectory()) {
            File files[] = file.listFiles();
            for (int i = 0; i < files.length; i++) {
                deleteFolder(files[i]);
            }
        }
        file.delete();
    }

HttpURLConnection下载

	private Bitmap downloadByHttp(String url) {
        try {
            URL httpUrl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection) httpUrl
                    .openConnection();
            conn.setReadTimeout(5000);
            conn.setRequestMethod("GET");
            conn.setDoInput(true);
            InputStream is = conn.getInputStream();

            //转化为bitmap
            Bitmap bitmap = BitmapFactory.decodeStream(is);
            is.close();
            return bitmap;

        } catch (IOException e) {
        }
        return null;
    }

okhttp下载

    private Bitmap downloadByOkhttp(String url) throws IOException {

        OkHttpClient client = new OkHttpClient();
        //获取请求对象
        Request request = new Request.Builder().url(url).build();
        //获取响应体
        ResponseBody body = client.newCall(request).execute().body();
        //获取流
        InputStream is = body.byteStream();

        //转化为bitmap
        Bitmap bitmap = BitmapFactory.decodeStream(is);
        is.close();
        return  bitmap;
    }

保存图片

    private void onSaveBitmap(final Bitmap mBitmap, final Context context,String path) {

        try {
            FileOutputStream fos = context.openFileOutput(path,MODE_PRIVATE);
            mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            fos.flush();
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

结果:
1.
在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述
4.
在这里插入图片描述
5.
在这里插入图片描述
6.
在这里插入图片描述

分析总结

  由于这3种下载方式在同一个程序里。程序每次请求url所需时间会受到请求顺序的影响,因此按全排列顺序,共进行6次测试。另外由于本人能力不足,测试的下载链接只有同一个下载链接又因为glide下载一个链接的图片后,会有缓存,第二次用glide下载,速度非常快(只需几十ms),因此为了解决这个问题,我每测试一次都会clean project并卸载手机里的APP
  从测试结果来看,6次测试中,1、3、4 HttpURLConnection最快,2、6 glide最快,5 okhttp最快。
  HttpURLConnection比glide快4次,比okhttp快5次。
  最后个人觉得Android原生自带的HttpURLConnection下载最快。其他两个源码实现有应该调用了HttpURLConnection实现了下载。这个测试只是下载单个图片,相对原生的HttpURLConnection下载,其他两个框架,不知道有没有封装多线程批量下载图片的方法。
  当然我比较菜,没去看源码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值