一、自己封装URLConnection 连接请求类

   public void downloadFile1() {try{//下载路径,如果路径无效了,可换成你的下载路径String url = "http://c.qijingonline.com/test.mkv";String path = Environment.getExternalStorageDirectory().getAbsolutePath();final long startTime = System.currentTimeMillis();Log.i("DOWNLOAD","startTime="+startTime);//下载函数String filename=url.substring(url.lastIndexOf("/") + 1);//获取文件名URL myURL = new URL(url);URLConnection conn = myURL.openConnection();conn.connect();InputStream is = conn.getInputStream();int fileSize = conn.getContentLength();//根据响应获取文件大小if (fileSize <= 0) throw new RuntimeException("无法获知文件大小 ");if (is == null) throw new RuntimeException("stream is null");File file1 = new File(path);if(!file1.exists()){file1.mkdirs();}//把数据存入路径+文件名FileOutputStream fos = new FileOutputStream(path+"/"+filename);byte buf[] = new byte[1024];int downLoadFileSize = 0;do{//循环读取int numread = is.read(buf);if (numread == -1){break;}fos.write(buf, 0, numread);downLoadFileSize += numread;//更新进度条} while (true);Log.i("DOWNLOAD","download success");Log.i("DOWNLOAD","totalTime="+ (System.currentTimeMillis() - startTime));is.close();} catch (Exception ex) {Log.e("DOWNLOAD", "error: " + ex.getMessage(), ex);}
}

这种方式在Android 刚兴起的时候,很少下载封装框架,就自己封装了。虽然一般的文件都能下载,但这种方式缺点很多,不稳定或者各种各样的问题会出现。

二、Android自定的下载管理(会在notification 显示下载的进度,同时可以暂停、重新连接等)

private void downloadFile2(){//下载路径,如果路径无效了,可换成你的下载路径String url = "http://c.qijingonline.com/test.mkv";//创建下载任务,downloadUrl就是下载链接DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));//指定下载路径和下载文件名request.setDestinationInExternalPublicDir("", url.substring(url.lastIndexOf("/") + 1));//获取下载管理器DownloadManager downloadManager= (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);//将下载任务加入下载队列,否则不会进行下载downloadManager.enqueue(request);
}

这种方式其实就是交给了Android系统的另一个app去下载管理。这样的好处不会消耗该APP的 CPU资源。缺点是:控制起来很不灵活。

三、使用第三方 okhttp 网络请求框架

private void downloadFile3(){//下载路径,如果路径无效了,可换成你的下载路径final String url = "http://c.qijingonline.com/test.mkv";final long startTime = System.currentTimeMillis();Log.i("DOWNLOAD","startTime="+startTime);Request request = new Request.Builder().url(url).build();new OkHttpClient().newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {// 下载失败e.printStackTrace();Log.i("DOWNLOAD","download failed");}@Overridepublic void onResponse(Call call, Response response) throws IOException {Sink sink = null;BufferedSink bufferedSink = null;try {String mSDCardPath= Environment.getExternalStorageDirectory().getAbsolutePath();File dest = new File(mSDCardPath,   url.substring(url.lastIndexOf("/") + 1));sink = Okio.sink(dest);bufferedSink = Okio.buffer(sink);bufferedSink.writeAll(response.body().source());bufferedSink.close();Log.i("DOWNLOAD","download success");Log.i("DOWNLOAD","totalTime="+ (System.currentTimeMillis() - startTime));} catch (Exception e) {e.printStackTrace();Log.i("DOWNLOAD","download failed");} finally {if(bufferedSink != null){bufferedSink.close();}}}});
}

okhttp是一个很有名气的开源框架,目前已经很多大公司都直接使用它作为网络请求库(七牛云SDK, 阿里云SDK)。 且里面集成了很多优势,包括 okio (一个I/O框架,优化内存与CPU)。
综合来看,第三种方案是最佳的,是目前最流行的下载方案。

Android 文件下载三种基本方式相关推荐

  1. Android 的三种定位方式

    转载自:http://blog.csdn.net/luosiye312/article/details/50562309#comments Android 定位大致分为三大类:GPS定位:Networ ...

  2. android画面数据存储方式,Android的三种储存方式

    SharePreferences SharePreferences适合用来保存相对较小的键值集合,比如应用程序的配置文件,它本质是存放在/data/data/[包名]/shared_prefs文件夹下 ...

  3. Android之Android Studio三种方式导入外部资源 以及 报错处理

    Android Studio三种方式导入外部资源 以及 报错处理 android studio提供了三种方式导入外部资源: 1. Library dependency – 在线添加.需联网下载 . 2 ...

  4. Android的三种网络联接方式(URL / HttpURLConnection | HttpClient | InetAddress )

    Android SDK 中一些与网络有关的package,如下: 包描述 java.net 提供与联网有关的类,包括流和数据包(datagram)sockets.Internet 协议和常见 HTTP ...

  5. Android的surface的三种工作方式

    注:文章内容是基于kitkat进行的粗线条分析,做为学习过程中的小结. Surface的三种使用方式 Native层的Surface工作方式有:仅在Proxy端.Proxy和Service端协同.仅在 ...

  6. python中if brthon环境安装包_Ant、Gradle、Python三种打包方式的介绍

    今天谈一下Androdi三种打包方式,Ant.Gradle.Python. 当然最开始打包用Ant 很方便,后来转Studio开发,自带很多Gradle插件就用了它,然后随着打包数量越多,打包时间成了 ...

  7. Android 中三种启用线程的方法

    多线程就是分时利用CPU,宏观上让所有线程一起执行 ,也叫并发 先调用start后调用run 1.start()方法来启动线程,真正实现了多线程运行. 这时无需等待run方法体代码执行完毕,可以直接继 ...

  8. Android方法的概括,Android_Android中startService基本使用方法概述,Android中有两种主要方式使用Ser - phpStudy...

    Android中startService基本使用方法概述 Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindServi ...

  9. 百度地图导航的接入(包含三种选择方式驾车、公交、步行)

    百度地图导航的接入(包含三种选择方式驾车.公交.步行) 步骤 1.下载百度的sdk(下载地址:http://lbsyun.baidu.com/sdk/download) 勾选下载"检索功能& ...

  10. xml的三种解析方式

    本篇博客重点介绍Android中三种解析XML的方式,包括PULL.SAX.DOM,当然不止这些,还可以用第三方的jar包提供的解析,只是这三种在Android中比较常用吧.再顺便介绍一下Androi ...

最新文章

  1. java设计模式----装饰器模式
  2. c语言 静态链表插入排序,数据结构C语言版 表插入排序
  3. 项目的技术路线怎么写_资讯丨空压机节能改造项目技术路线
  4. Micropython开发实例之TPYBoard v702GPRS功能测试
  5. Internet Explorer7.0仿冒网站筛选功能的使用
  6. 独木舟上的旅行http://acm.nyist.net/JudgeOnline/problem.php?pid=71
  7. 软件工程——理论、方法与实践③
  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统(19)-权限管理系统-用户登录
  9. 用户会话,数据控件和AM池
  10. js里面拼接代码和使用ModelAndView
  11. 树上有10只鸟,打死1只,还剩几只?答案太牛了!
  12. 生产环境Nginx配置文件
  13. 如何不授权情况下获取自己微信openid/傻瓜式获取
  14. 计算机室内设计cad实践报告,室内设计师助理实习报告范文
  15. 一个dsp最小系统至少要有_DSP最小系统
  16. CentOS7 Linux引导修复
  17. mysql 查询数据库ip_如何查看连接MYSQL数据库的IP信息
  18. Synchronized同步锁是如何实现的
  19. 怎么给Mongodb设置账号密码(跳坑版)
  20. 如何用Word优雅地打印代码

热门文章

  1. JavaScript 中级篇:模块化编程
  2. HTML+CSS+JS制作炫酷特效代码
  3. 处理uniapp开发安卓app进入打开手机的游戏加速模式
  4. [题解]luogu_P3593_[NOIP2017]逛公园(最短路相关计数
  5. Matlab 三角函数(sin)
  6. 管理运筹学教程_期末复习_总结笔记
  7. MULTISIM下载安装
  8. 51单片机原理以及接口技术(一)-单片机发展概述
  9. 企业如何选择固定资产管理系统?
  10. 普渡斩获双奖——“2020年度科创人物”、“2020杰出科技抗疫奖”!