Download模块 (十五)

Download模块 (十五)

DownloadInfo实现了Parcelable<因为需要在binder之间进行传递>,
顾名思义,封装了一个Download的所有必要信息,信息足够使接收端构造出合乎发送端需求的DownloadTask。
并且Info在接收端也会承载起M的角色,所有也会有一些setter来更新其信息。

<1>实现了Parcelable接口:
(1)describeContents()直接返回0即可。
(2)ClassLoaderCreator没有实现并实例化,不需要
(3)重点是Creator接口的实现<从parcable恢复>(注意还要求 provided as a public CREATOR field就是还要实例化一个public的Creator,
Creator要求实现两个方法,一个是从Parcel中恢复出一个被Parcel的对象,另外一个能够构造一个被Parcel的对象的引用数组<简单实现,
直接new 了一个>)
为了方便起见,直接定义了一个private的根据Parcel作为输入的DownloadInfo构造函数<内部实现就是按照约定好的顺序从parcel读出值并
赋给相应成员变量>。
 和 writeToParcel<填入到parcable>

<2>DownloadInfo是一个M角色:
int mUniqueId; 独一无二的id, 通过url和startTime的字符串拼接<独一无二>然后调用hashCode得到.
DownloadTask.Status mStatus = DownloadTask.Status.NOT_START;
long mStartTime; <System.currentTimeMillis()>
long mEndTime;
long mTotalSize;
long mProgress;
boolean mIsFileNameSuppliedByUser; 下载文件的名字是否是由用户提供的,如果是,那么就强制使用该文件名。
boolean mFileNameDetermined;
String mPath;文件保存路径,显然不用存一个File对象,一般都是一个setting保存的下载路径+filename拼接
String mUrl;
String mReferrer;
String mUserAgent;
String mEtag;
String mLastModified;
String mMimeType;
int mThreadNum; 下载所使用的线程,个人觉得这里破坏了对Downloader的封装性,不过设计时又希望Proxy端可以指定线程数,
并且,如同前面所说,Info在Service这一端除了传递信息,还起到了承载记录信息的作用,所以也还好。
private static final long[] EMPTY_LONGS = new long[0];
long[] mMultiThreadDownloadedSizes = EMPTY_LONGS; 这个是记录每个实际的DownloadThread已经下载的数据量。
当前指向一个0长数组,但是在后面ThreadNum确定的时候会设置为一个同样长度的数组。
long mMultiThreadDownloadStartPosition; 记录了此次下载应该开始的position<断点下载>.
String mTag;
boolean mFailStatRecorded;

<2>上面这些信息几乎都有对应的setter/getter,有些信息在构造的时候也不需要传入,使用APP本身的setting。
并且也private了默认的无参构造器。
需要构造时传入的有:
url
referer
filename<可以为空>
UA
totalSize<可以为-1,在connect以后获取真正大小>
isUserSuppliedFileName 不强制

<3>所有字符串成员变量引用,如果是null的话,在writeToParcel会被写成空字符串填入parcel,恢复的时候就从null变成了空字符串。
不过这样做并没有什么副作用。

<4>之前提过为了持久化当前的下载情况,会将DownloadInfo转为字符串写入文件,这是通过先将其转化为一个JsonObject然后再直接toString
的,在转化时,先new 一个 空的 JsonObject,然后将所有的信息通过k-V put,出现JsonException并不会返回null,
而是力所能及<这一点有争议>.

<5>同样,要从持久化的文件中的字符串恢复,自然需要一个从JsonObject恢复到DownloadInfo的逆方法,
同样,先new一个 空壳DownloadInfo<private构造函数>,然后利用json.isNull(Key),来决定是否需要提取值并设置给Info对象,
注意这种情况如果出现了JsonException,会返回null,因为一个不完整Info会引起很大的潜在问题。

<6>注意Parcel不支持read/write单个boolean<BooleanArray可以>,转换成int。
enum也不能,直接写入其Oridinal值,然后通过values()[oridinal]恢复

<7>在恢复时使用classLoader,  data.readParcelable(DownloadInfo.class.getClassLoader())<不必自己做类型转化,泛型的>;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值