首页 > 代码库 > 文件下载---解决方案---类似360同步客户端

文件下载---解决方案---类似360同步客户端

需求:

在某个文件管理Activity中,点击某个Item,就下载文件;

点击所有Item,将所有Item所对应的文件,逐个下载。

某个文件在下载时,界面要不断显示出下载进度。

服务器的文件和本地的文件是使用同一个目录,根360的同步客户端类似。

要注意的地方:

1.正在下载某个文件,但是该Activity销毁了。此时要中断文件的下载操作。

2.再次进入该文件管理Activity时,要判断出某个文件是否是有效的。

我的实现思路是这样:

文件管理Activity;文件下载DownloadLooper线程;本地文件大小检测DetectSizeLooper线程;

一个数据表FileInofoTable。

需要这个四个部分相互协作来完成功能。

具体思路:

1.进入文件管理Activity的时候,检测FileInfoTable是否存在,如果没有存在则创建该数据表。

2.在检测某个文件是否有效的时候,利用服务器传递过来的Item,检查本地是否存在该文件,如果存在,利用Item对象中字段序号值(唯一标识一个文件)去查FileInfoTable,判定该本地存放的文件是否是有效的。如果有效,则无需下载;如果无效,则删除。

----------点击单个文件,进行下载的实现流程------------------------------------------

0.启动一个DownloadLooper线程。

1.获取该Item,发送下载请求信息给DownloadLooper线程。DownloadLooper线程根据信息类型,执行下载操作。

2.DownloadLooper线程,在开启下载后,在接收到要下载的文件大小后,发送信息给DetectSizeLooper

线程;并且。DetectSizedLooper不断检测本地文件的大小,对比要下载的文件大小,并且不断发出更新信息给文件管理Activity,让它更新文件下载进度。

3.在DownloadLooper线程要结束之前,检测当地的文件大小,和要下载的文件大小,文件的序号,写到FileInfoTable中。----没有下载完毕,也保存。

4.当文件管理Activity,发现,本地文件大小和要下载的文件大小相等时,就发送两个消息,让DetectSizeLooper和DownloadLooper线程停止;并且将文件信息保存到FileInfoTable。

其它情况:

1).Activity,系统调用onDestroy方法时,发送两个消息给DetectSizeLooper和DownloadLooper线程,让它们停止。

----------点击单个文件,进行下载的实现流程------------------------------------------

---------当多个文件被选中,多个文件要下载时--------------------------------------------

0.启动一个DownloadLooper线程。

1.启动一个DetectSizeLooper线程。

2.维护一个下载队列,将所有待下载的Item都放到该队列中。

3.获取该Item,发送下载请求信息给DownloadLooper线程。DownloadLooper线程根据信息类型,执行下载操作。

4.DownloadLooper线程,在开启下载后,在接收到要下载的文件大小后,发送信息给DetectSizeLooper

线程;并且。DetectSizedLooper不断检测本地文件的大小,对比要下载的文件大小,并且不断发出更新信息给文件管理Activity,让它更新文件下载进度。

5.在DownloadLooper线程要结束之前,检测当地的文件大小,和要下载的文件大小,文件的序号,写到FileInfoTable中。----没有下载完毕,也保存。


6.文件管理Activity,接收到某个文件下载完毕的消息时,对比本地文件大小和要下载的文件大小,是否相等,若是,则保存信息到FileInfotable中,并且将当前Item从下载队列中移除,取出一个新的Item,再次重复上述过程;若已经没有可以取得队列,则发送消息,停止DownloadLooper线程和DetectSizeLooper线程。

其它情况:

1).Activity,系统调用onDestroy方法时,发送两个消息给DetectSizeLooper和DownloadLooper线程,让它们停止。

---------当多个文件被选中,多个文件要下载时--------------------------------------------