Android 文件下载三种基本方式

一、自己封装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() { @Override public void onFailure(Call call, IOException e) { // 下载失败 e.printStackTrace(); Log.i("DOWNLOAD","download failed"); } @Override public 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 文件下载三种基本方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

时间: 2024-09-24 00:06:25

Android 文件下载三种基本方式的相关文章

Android XML数据的三种解析方式_Android

本篇文章包含以下内容:      XML数据的Dom解析      XML数据的Sax解析      XML数据的Pull解析      Activity中使用三种解析      Sax解析与Pull解析区别 三种解析方式的步骤: 1.在Assets文件夹中模拟创建XML数据 2.创建对应XML的Bean对象 3.开始解析 XML数据的Dom解析 DOM解析XML文件时,会将XML文件的所有内容读取到内存中(内存的消耗比较大),然后允许您使用DOM API遍历XML树.检索所需的数据 一.在As

Android 打包三种方式实例详解

Android 打包三种方式实例详解 前言: 现在市场上很多app应用存在于各个不同的渠道,大大小小几百个,当我们想要在发布应用之后统计各个渠道的用户下载量,我们就要进行多渠道打包. 01.应用的打包签名什么是打包? 打包就是根据签名和其他标识生成安装包. 签名是什么? 1.在android应用文件(apk)中保存的一个特别字符串 2.用来标识不同的应用开发者:开发者A,开发者B 3.一个应用开发者开发的多款应用使用同一个签名 就好比是一个人写文章,签名就相当于作者的署名. 如果两个应用都是一个

在android中有几种布局方式和他们的特点是?

问题描述 在android中有几种布局方式和他们的特是? 解决方案 解决方案二:楼主是说有多少个view类?解决方案三:求解!解决方案四:有五种布局方式1.绝对布局2.相对布局3.框架布局4.表格布局5.线性布局

Android 中三种启用线程的方法总结

在多线程编程这块,我们经常要使用Handler(处理),Thread(线程)和Runnable这三个类,那么他们之间的关系你是否弄清楚了呢? 首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应. 而Runnable是一个接口,Thread是Runnable的子类.所以说,他俩都算一个进程. HandlerThread顾名思义就是可以处理消息循环的线程,他是一个拥有Looper的线程,可以处理消息循环

无线路由器的三种加密方式

  无线路由器主要提供了三种无线安全类型:WPA-PSK/WPA2-PSK.WPA/WPA2 以及WEP.不同的安全类型下,安全设置项不同. 1. WPA-PSK/WPA2-PSK WPA-PSK/WPA2-PSK安全类型其实是WPA/WPA2的一种简化版本,它是基于共享密钥的WPA模式,安全性很高,设置也比较简单,适合普通家庭用户和小型企业使用.其具体设置项见下图所示: 认证类型: 该项用来选择系统采用的安全模式,即自动.WPA-PSK.WPA2-PSK. 自动:若选择该项,路由器会根据主机请

Linq to Sql : 三种事务处理方式

原文:Linq to Sql : 三种事务处理方式     Linq to SQL支持三种事务处理模型:显式本地事务.显式可分发事务.隐式事务.(from  MSDN: 事务 (LINQ to SQL)).MSDN中描述得相对比较粗狂,下面就结合实例来对此进行阐述. 0. 测试环境 OS Windows Server 2008 Enterprise + sp1 IDE Visual Studio 2008, .net framework 3.5 + SP1 DB SQL Server 2000

IIS下PHP的三种配置方式对比_php技巧

在Windows IIS 6.0下配置PHP,通常有CGI.ISAPI和FastCGI三种配置方式,这三种模式都可以在IIS 6.0下成功运行,下面我就讲一下这三种方式配置的区别和性能上的差异.   1.CGI(通用网关接口/Common Gateway Interface)一般是可执行程序,例如EXE文件,和WEB服务器各自占据着不同的进程,而且一般一个CGI程序只能处理一个用户请求.这样,当用户请求数量非常多时,会大量占用系统的资源,如内存.CPU时间等,造成效能低下.   2.ISAPI(

java代码中init method和destroy method的三种使用方式

在Java的实际开发过程中,我们可能常常需要使用到init method和destroy method,比如初始化一个对象(bean)后立即初始化(加载)一些数据,在销毁一个对象之前进行垃圾回收等等. 周末对这两个方法进行了一点学习和整理,倒也不是专门为了这两个方法,而是在巩固spring相关知识的时候提到了,然后感觉自己并不是很熟悉这个,便好好的了解一下. 根据特意的去了解后,发现实际上可以有三种方式来实现init method和destroy method. 要用这两个方法,自然先要知道这两

php实现递归的三种基本方式_php技巧

递归函数是我们常用到的一类函数,最基本的特点是函数自身调用自身,但必须在调用自身前有条件判断,否则无限无限调用下去.实现递归函数可以采取什么方式呢?本文列出了三种基本方式.理解其原来需要一定的基础知识水品,包括对全局变量,引用,静态变量的理解,也需对他们的作用范围有所理解.递归函数也是解决无限级分类的一个很好地技巧.如果对无限级分类感兴趣,请参照php利用递归函数实现无限级分类.我习惯套用通俗的话解释复杂的道理,您确实不明白请参见手册. 利用引用做参数 先不管引用做不做参数,必须先明白引用到底是