添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
追风的麻辣香锅  ·  c/c++ ...·  1 年前    · 
苦恼的登山鞋  ·  修复.NET ...·  1 年前    · 
1、多线程介绍

用过迅雷的同学都知道,迅雷有个功能叫做多线程,还有一个叫离线 下载 ,我们这里重点介绍一下多线程下载。多线程,顾名思义就是很多歌线程同时在运行,为什么要提出多线程这个概念呢?因为有时候一个线程下载太慢了。举个例子,比如小时候常做的数学题,一个人挖沟需要15天,那么两个人对着挖呢?

当然数学题上面两个人的效率是不一样的,我们这里把这个问题简化了一下,只是想大家明白,什么是多线程,为什么有多线程。

在多线程上出现过一个问题,为什么有要提出多线程?其实提出多线程是为了充分利用CPU的硬件资源,解决应用程序等待的问题。多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。

2、思路
(1)获取网络连接
(2)初始化多线程下载信息,开始下载
(3)开辟硬盘空间,用于存放数据资源
(4)把从网络获取的数据放入申请的空间中
(5)下载完毕,关闭资源链接

给出一个下载400M电影的示意图,如下所示:

RandomAccessFile支持随机的访问
HTTP的Range头字段指定每个线程从文件的什么位置开始下载。

3、代码解析

3.1 设置需要下载文件的信息


4、断点续传

断点续传是说在下载的时候,我们因为某些原因,导致了下载的暂停,比如在电脑上,我们的电脑突然断电了,手机上的网络中断了,都会导致当前的下载任务终止,那么当我们再次回来的时候,程序应该是可以继续下载的,不然前面下载的资源就都浪费了。
根据上面的描述,我们应该可以知道,实现断点续传,关键是实现下载的数据存储在数据库中,等到之后我们程序再次进入的时候,会到数据库中去查询一下数据,然后接着继续下载。而存储数据到数据库并不是太复杂,难的是如何识别程序的哪些数据被下载了,哪些数据是没有下载的,这里,我们在下载的时候使用了下载的线程id做识别。
如果该线程id的数据没有被完整下载,应该是不会存储到数据库的,那么这一部分的数据就要重新下载,在下载完成之后,数据拼接起来就是一个完整的文件了。

在上篇 Android 文件多线程下载中进行了粗略的封装,这里为了调用方便,继续丰富一下。 最终调用接口案例: String url1 = "http://vjs.zencdn.net/v/oceans.mp4"; DownLoader downloader = new DownLoader.Builder(getApplicationContext()) .url(url1) .cacheDirName("Images") .suffix(Downloader 找到自己APP的包名点开进入下载目录,可以看到文件已经被下载到指定的位置。可以看到已经在下载了,下载完成后可以如图打开目录。在ApiService 中添加下载接口。创建弹窗工具类,使用刚才创建好的布局。,用到了挂起函数必须在协程中使用。编写具体调用下载接口的代码。先定义一个下载参数实体。别忘了加上网络请求权限。一个圆角白色背景样式。 以下代码是基于百度云网盘:http://pan.baidu.com/s/1dD1Xo8T 中的demo进行优化及功能添加。 以下代码 实现 功能有:多线程下载、多任务并行下载以及下载进度和下载速度的显示等功能。 实现 思路:根据线程数分割待下载文件;利用HttpURLConnection 实现 各部分文件的下载;利用RandomAccessFile 实现 下载内容的保存;各线程下载任务信息保存在数据库,以便暂 上一篇博客整理了一下HttpURLConnection断点下载文件的方法。其实还有另外一种下载大文件的方法。就是通过DownloadManager来进行下载的,如果可以后台下载更新,那么用DownloadManager来下载更轻松一点。 先说我遇到的坑吧: 1, 文件下载 地址必须是https 2, 文件下载 地址不能有302等重定向下载操作 那么如果真的是有302的话,那么可以怎么绕过呢? public... 在做 android 开发的时候,经常需要从网上下载一些图片,在界面上显示,一般的获取图片都会使用如下的代码: //获取connection,方法略 conn = getURLConnection(url); is = conn.getInputStream(); //获取Bitmap的引用 Bitmap bitmap = BitmapFactory.decodeStream(is) ... 首先先感谢风神,核心代码源于他的这篇微博http://blog.csdn.net/cfy137000/article/details/54838608,思路很棒。基于他的代码做了一些改动, 实现 我所需功能。       先说下我的需求。我的需求是PC端先进行更新数据的管理,然后移动端登录时候会自动访问服务,传入mac值,获取需更新数据的信息。如下图所示: implementation 'com.squareup.retrofit2:retrofit:2.4.0' implementation 'com.squareup.retrofit2:adapter-rxjava:2.4.0' implementation 'com.squareup.retrofit2:converter-gson:2.4.0' implementation 'i. //创建下载任务 DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); //在通知栏中显示,默认就是显示的 request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);