Android类FileDownloadList分析(2)
创建一个FileDownloadList对象后,就可以直接使用该下述方法来实现下载功能。
downloadFile(String fileName, String saveDir, String saveName, Runnable callback)
在实现上是这么个意思:
1.在当前上下文,开启下载线程。当获取到要下载的文件的大小时,发送一个广播过来(这部分没有展示在上述代码中)。
2.在当前上下文中,注册一个广播监听器,监听广播标识为SAVE_DOWNLOAD_FILE的广播。首次监听到发出来的广播后,首次发送过来的广播,包含了要下载的文件的大小信息,然后就每隔5毫秒检测本地文件的大小,直到本地文件的大小(loadedSize)大于等于要下载的文件(fileLength)大小时,退出该循环。
在不断检测的过程中,通过mHandler.sendMessage(mHandler.obtainMessage()); ,让UI线程更新进度条。
下载线程,会不断将服务器返回的数据流,写到本地文件中,所以,本地文件的大小会不断变化,直到,它的大小跟要下载的文件的大小相等时,就退出这个不断检测本地文件大小的线程。
其它没有在上述代码中表现出来的内容(在其它部分的代码中):
1.在invokeFile( final BaseRequestLims request)方法中,开了一个如下的下载线程.该下载线程,会将服务器返回的文件流,写到本地文件(localFile)中;然后,它还会发送一个标识为SAVE_DOWNLOAD广播,包含的信息有要下载文件的文件大小fileLength。
//下载的子线程
new Thread(){
@Override
public void run() {
super.run();
HttpHelper.invoke(request);
}
}.start();
上述代码存在的问题:
1.上下文,使用的是某个Activity,如果发生系统调用了该Activity的onDestroy()时,下载线程还没有完成,也就意味着,loadedSize的大小还是小于fileLength。从而,那个不断检测本地文件大小的线程就一直在执行着。
即是检测本地文件大小的线程和下载线程还在执行着:
检测本地文件大小的线程:
new Thread(){
@Override
public void run() {
super.run();
while(true){
try{
Thread.sleep(500);
}catch (Exception e) {
e.printStackTrace();
}
mHandler.sendMessage(mHandler.obtainMessage());
//获取下载文件的大小
int loadedSize = (int)localFile.length();
if(loadedSize >= fileLength){
break;
}
}
}
}.start();





