第一轮考核总算结束了,幸好努力没有白费,过了第一轮考核。之前一直都在做项目,找bug,一直没时间写下博客。
回顾下后台断点下载,这个可以说当初自己在上面花的时间也是比较多的。如果会下载,后台下载就不难了,就是写一个类继承服务,把代码放进服务里面。其中服务的启动方式有两种;一种是startservice,另外一种是bindservice,这两种方式都可以启动服务,但是bindservice的生命周期随着Activity的结束而结束,所以当退出当前的Activity的时候,用bindservice启动的服务就会停止,而用startservice启动服务,这种启动方式,当你退出当前的Activity的时候,服务还是在运行的,必须调用stopservice的方法去停止服务。
接下来就是断点下载,刚开始的时候,在网上百度的断点下载,他们都是开了多线程的,然后弄得很复杂,然后给我的感觉就是断点下载时多么的高大上的感觉,对于我们初涉安卓的开发者来说,其实断点下载就是暂停以后不用再重新重头再下载当前你要下载的文件,这个问题所在就是获取你当前下载的文件的长度,并且获取当前文件的总的大小,当文件在下载的时候,到暂停的时候,每次暂停完就重新读取下当前下载的文件的大小。
设置断点下载的起点和终点:setRequestProperty("Range", "bytes=" + file.length()+ "-" + end);
在设置断点下载的时候,需要用
RandomAccessFile
因为RandomAccessFile是不同于OutputStream和InpStream的类的,关于这两者的区别了一参考
http://blog.csdn.net/akon_vm/article/details/7429245
该博客里面详细写了RandomAccessFile与OutputStream和InpStream的区别。
在这里我简单的说下RandomAccessFile能在文件读取和记录文件的大小和位置,调用其seek的方法即可,而OutputStream则每次都需要从头开始读写输入流的文件。
当初我弄断点下载的时候就一直卡在用OutputStream这个类。
以上仅代表个人的一些浅薄的理解,如有错误,欢迎各位指出。
代吗如下:
new Thread() {
public void run() {String urlDownload = "http://192.168.1.119:8080/download/"+ fileName + "?account=" + account + "&password="+ password;
// 获得存储卡路径,构成保存文件的目标路径
File newFile = new File(pathName);
if (!newFile.exists()) {
newFile.mkdir();
}
String newFileName = fileName;
newFileName = pathName + newFileName;
File file = new File(newFileName);
long sum = file.length();
// 如果目标文件已经存在且目标文件的大小为完整的文件,则删除
if (file.exists()) {
if (sum == end) {
file.delete();
sum=0;
}
}
try {
// 构造URL对象
URL url = new URL(urlDownload);
// 打开连接
URLConnection con = url.openConnection();
// 设置下载的起点和终点,起点为当前文件的长度,终点为整个文件的大小
con.setRequestProperty("Range", "bytes=" + file.length()+ "-" + end);
// 1K的数据缓冲
byte[] bs = new byte[10240];
// 定义一个变量,表示读取到的数据长度
int len = 0;
// 输入流
InputStream is = con.getInputStream();
// 输出的文件流,RandomAccessFile与OutputStream有区别的,RandomAccessFile能在文件里面前后移动
RandomAccessFile os = new RandomAccessFile(newFileName,"rw");
os.seek(file.length());
// OutputStream os = new FileOutputStream(newFileName);
while (((len = is.read(bs)) != -1)) {
if (flag) {
os.write(bs, 0, len);
sum += len;
} else {
os.close();
is.close();
break;
}
}
if (sum == end) {
showNotification(intent);
try {
sqliteDelete(intent);
} catch (Exception e) {
if(database!=null){
database.close();
}
}
}else{
if(database!=null){
database.close();
}
}
os.close();
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
stopService(intent);