DownLoad模块 (一)

DownLoad模块 (一)

DownLoad abstarct Class 实现了Comparable:
这个类的定位基本就是该次DownLoad所有信息的聚合体,并且作为一个基类的角色存在,
在抽象上就是一个DownLoad<任务>。
虽然倾向于一个纯粹的数据结构,不过还是定义了一些行为.
在MVC中的角色是 一个 重M+轻C<其实C那部分的行为也是可以算作是M的,MVC并没有要求M不能有任何的外部操作行为,
并且其外部行为也就是发出一个事件,然后其他的Listener监听执行>的角色.
这个类所聚合的数据有:
1. 独一无二的id标示 <该类内部维护一个static的availableId, 每次有新的DownLoad都分配完以后递增>
2. 对应的File对象<代表了持久化>
3. 在UI上要显示的名字<注意UI上显示的名字可以和实际的文件名不同的,因此是需要一个专门的Field>
4. 该DownLoad 任务此时的状态<没有开始, 正在进行,被暂停,失败,文件损坏,完成>,这些状态一开始设计的时候
没想全,都是在后面迭代的时候加入的,直接作为Enum类型.
5. 当前的进度
6. 该DownLoad文件的总大小<采用的是http协议下载,因此一般来说,除非是chunk编码的,否则一开始基本都可以知道文件总大小>
7. 当前已经下载的数据量<当然是Byte为单位>,存在的意义主要是为了上面提到的chunk case。
8/9. 开始/结束时间 <long>
10. 该下载文件的MIME类型<因为是http协议下载,因此可以从header中得到,还可以从文件名后缀取的> <String>
11. 用于在UI上显示的Icon,存在缺省值,针对MIME以及从APK安装包提取可以获得更多选择.
12. 下载文件是APK安装包的话, APK的PackageName,为了支持对APK安装包的更多行为<安装>
13. 下载文件是APK安装包的话, APK的version code,为了支持对APK安装包的更多行为<安装 更新的判断>

<1>构造函数允许有一个空的DownLoad,这样做的目的是可以实现 先构造一个空壳, 然后后面不断的根据信息来进行填充设置.
以及以File作为参数的构造函数,一个定制构造罢了(可以自定义实际存储文件的名字),这种情况下File不能是null<否则 throw IllegalArgumentException>,因为使用了该构造函数就表示遵从了一个不会传输空File的契约.

<2>一堆get/setXXX()函数,一些细节<迭代过程中不断添加的>:
  (1) 获取UI显示的名字,如果没有设置过,那么直接使用File的getName()
  (2) 设置当前状态时,会触发事件,不过要做一个refresh检查,看是否真的发生了变化<vary check>
      APK的PackageName和Version只有在下载完成以后才可以得到,这一步当然是会在设置当前状态中进行check.
      以及更新EndTime
  (3) 设置当前进度<暂时没有加 vary check>, 触发事件.
  (4) 设置当前下载量,会触发更新UI事件.
<3>delete<删除Task+文件>
<4>remove<只删除Task>
<5>hashCode, 如果已经start,可以用startTime位移+异或得到,否则,用File的hashCode
<6>equals,  先比较引用看是否同一个对象,否则进行instanceof判断,然后调用自己实现的compareTo比较
<7>compareTo 主要是为了在UI上的显示排序,先start的在后,如果没有start,那么就直接比较File
<8>一些abstract方法: pause resume ..... <不同的下载方式,具体操作都不同>
   delete和remove虽然是Final的,但是其内部调用了protecetd的内部函数<浅层接口封装>.


发布了426 篇原创文章 · 获赞 51 · 访问量 65万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览