Android开发——断点续传原理以及实现( 二 )

get(String url);//是否存在public boolean isExits(String url);}
5. 具体的文件下载逻辑

Android开发——断点续传原理以及实现

文章插图
public class DownLoadUtil {//构造方法略public void download(){List lists = threadDAO.get(fileInfo.getUrl());FileInfo info = null;if(lists.size() == 0){//第一次下载 , 创建子线程下载new MyThread(fileInfo).start();}else{//中间开始的info = lists.get(0);new MyThread(info).start();}}class MyThread extends Thread{private FileInfo info = null;public MyThread(FileInfo threadInfo) {this.info = threadInfo;}@Overridepublic void run() {//向数据库添加线程信息if(!threadDAO.isExits(info.getUrl())){threadDAO.insert(info);}HttpURLConnection urlConnection = null;RandomAccessFile randomFile =null;InputStream inputStream = null;try {URL url = new URL(info.getUrl());urlConnection = (HttpURLConnection) url.openConnection();urlConnection.setConnectTimeout(3000);urlConnection.setRequestMethod("GET");//设置下载位置int start = info.getStart() + info.getNow();urlConnection.setRequestProperty("Range","bytes=" + start + "-" + info.getLength());//设置文件写入位置File file = new File(DOWNLOAD_PATH,FILE_NAME);randomFile = new RandomAccessFile(file, "rwd");randomFile.seek(start);//向Activity发广播Intent intent = new Intent(ACTION_UPDATE);finished += info.getNow();if (urlConnection.getResponseCode() == HttpStatus.SC_PARTIAL_CONTENT) {//获得文件流inputStream = urlConnection.getInputStream();byte[] buffer = new byte[512];int len = -1;long time = System.currentTimeMillis();while ((len = inputStream.read(buffer))!= -1){//写入文件randomFile.write(buffer,0,len);//把进度发送给Activityfinished += len;//看时间间隔 , 时间间隔大于500ms再发if(System.currentTimeMillis() - time >500){time = System.currentTimeMillis();intent.putExtra("now",finished *100 /fileInfo.getLength());context.sendBroadcast(intent);}//判断是否是暂停状态if(isPause){threadDAO.update(info.getUrl(),finished);return; //结束循环}}//删除线程信息threadDAO.delete(info.getUrl());}}catch (Exception e){e.printStackTrace();}finally {//回收工作略}}}}
上面也讲到使用自定义的类进行具体的文件下载逻辑 , 这也是最关键的部分了 , 在该类的构造方法中进行实例的创建 。并在()中通过数据库查询的操作 , 判断是否是第一次开始下载任务 , 如果是 , 则开启一个子线程进行下载任务 , 否则将进度信息从数据库中取出 , 并将该信息传递给 。
在中 , 通过info.() + info.()设置开始下载的位置 , 如果是第一次下载两个数将都是0 , 如果是暂停后再下载 , 则info.()会取出非0值 , 该值来自数据库存储 。使用告知服务器从哪里开始传递数据 , 传递到哪里结束 , 本地使用的seek()方法进行数据的本地存储 。使用广播将进度的百分比传递给 , 再改变进行UI调整 。
这里很关键的一点是在用户点击暂停后会在中调用. = true , 因此上面while循环会结束 , 停止下载并通过数据库的()保存进度值 。从而在续传时取出该值 , 重新对服务器发起文件起始点的下载任务请求 , 同时也在本地文件的相应位置继续写入操作 。本文原创 , 转载请注明出处为的博客 。
最后补充一点 , (17/4/11被面试问到了)关于断线续传的HTTP状态码并不是200 , 而是206 , 即. 。
6.效果如下所示
Android开发——断点续传原理以及实现

文章插图
Demo源码地址:链接:密码: e25p