Android网络编程之文件断点下载暂停 继续 重新下载.docx
- 文档编号:28869743
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:18
- 大小:54.03KB
Android网络编程之文件断点下载暂停 继续 重新下载.docx
《Android网络编程之文件断点下载暂停 继续 重新下载.docx》由会员分享,可在线阅读,更多相关《Android网络编程之文件断点下载暂停 继续 重新下载.docx(18页珍藏版)》请在冰豆网上搜索。
Android网络编程之文件断点下载暂停继续重新下载
Android网络编程之——文件断点下载(暂停/继续/重新下载)
一:
关于断点下载所涉及到的知识点
1.对SQLite的增删改查(主要用来保存当前任务的一些信息)
2.HttpURLConnection的请求配置
HttpURLConnectionconnection=null;
//设置下载请求属性
connection.setRequestProperty();
3.RandomAccessFile对文件进行写入
RandomAccessFilerwd=null;
//从文件的某一位置写入
rwd.seek();
4.基本的I/O流操作,以及逻辑处理
二:
第一步我们先来创建一张表用来保存我们的下载信息
publicclassDbHelperextendsSQLiteOpenHelper{
publicstaticStringTABLE="file";//表名
publicDbHelper(Contextcontext){
super(context,"download.db",null,1);
}
@Override
publicvoidonCreate(SQLiteDatabasedb){
//文件名,下载地址,下载文件的总长度,当前下载完成长度
db.execSQL("createtablefile(fileNamevarchar,urlvarchar,lengthinteger,finishedinteger)");
}
}
三:
第二步同时既然是对数据库的操作,那我们在DbHelper.class中来写好几个公用方法
/**
*插入一条下载信息
*/
publicvoidinsertData(SQLiteDatabasedb,FileInfoinfo){
ContentValuesvalues=newContentValues();
values.put("fileName",info.getFileName());
values.put("url",info.getUrl());
values.put("length",info.getLength());
values.put("finished",info.getFinished());
db.insert(TABLE,null,values);
}
/**
*是否已经插入这条数据
*/
publicbooleanisExist(SQLiteDatabasedb,FileInfoinfo){
Cursorcursor=db.query(TABLE,null,"url=?
",newString[]{info.getUrl()},null,null,null,null);
booleanexist=cursor.moveToNext();
cursor.close();
returnexist;
}
/**
*查询已经存在的一条信息
*/
publicFileInfoqueryData(SQLiteDatabasedb,Stringurl){
Cursorcursor=db.query(TABLE,null,"url=?
",newString[]{url},null,null,null,null);
FileInfoinfo=newFileInfo();
if(cursor!
=null){
while(cursor.moveToNext()){
StringfileName=cursor.getString(cursor.getColumnIndex("fileName"));
intlength=cursor.getInt(cursor.getColumnIndex("length"));
intfinished=cursor.getInt(cursor.getColumnIndex("finished"));
info.setStop(false);
info.setFileName(fileName);
info.setUrl(url);
info.setLength(length);
info.setFinished(finished);
}
cursor.close();
}
returninfo;
}
/**
*恢复一条下载信息
*/
publicvoidresetData(SQLiteDatabasedb,Stringurl){
ContentValuesvalues=newContentValues();
values.put("finished",0);
values.put("length",0);
db.update(TABLE,values,"url=?
",newString[]{url});
}
3.从上面方法中可以看出来还有一个FileInfo对象,没错这是自己创建的一个下载任务实体类一起来看看吧
//保存下载任务信息
publicclassFileInfo{
privateStringfileName;//文件名
privateStringurl;//下载地址
privateintlength;//文件大小
privateintfinished;//下载以已完成进度
privatebooleanisStop=false;//是否暂停下载
privatebooleanisDownLoading=false;//是否正在下载
//......
//剩下的都是对应的getandset方法就不贴出来了,自动生成就好了
四:
第三步我们创建一个类DownLoaderManger来管理我们的下载任务包括、添加下载任务、开始下载、暂停下载、重新下载
publicclassDownLoaderManger{
publicstaticStringFILE_PATH=Environment.getExternalStorageDirectory()+"/azhong";//文件下载保存路径
privateDbHelperhelper;//数据库帮助类
privateSQLiteDatabasedb;
privateOnProgressListenerlistener;//进度回调监听
privateMap
privatestaticDownLoaderMangermanger;
privateDownLoaderManger(DbHelperhelper,OnProgressListenerlistener){
this.helper=helper;
this.listener=listener;
db=helper.getReadableDatabase();
}
/**
*单例模式
*
*@paramhelper数据库帮助类
*@paramlistener下载进度回调接口
*@return
*/
publicstaticsynchronizedDownLoaderMangergetInstance(DbHelperhelper,OnProgressListenerlistener){
if(manger==null){
synchronized(DownLoaderManger.class){
if(manger==null){
manger=newDownLoaderManger(helper,listener);
}
}
}
returnmanger;
}
/**
*开始下载任务
*/
publicvoidstart(Stringurl){
db=helper.getReadableDatabase();
FileInfoinfo=helper.queryData(db,url);
map.put(url,info);
//开始任务下载
newDownLoadTask(map.get(url),helper,listener).start();
}
/**
*停止下载任务
*/
publicvoidstop(Stringurl){
map.get(url).setStop(true);
}
/**
*重新下载任务
*/
publicvoidrestart(Stringurl){
stop(url);
try{
Filefile=newFile(FILE_PATH,map.get(url).getFileName());
if(file.exists()){
file.delete();
}
Thread.sleep(100);
}catch(InterruptedExceptione){
e.printStackTrace();
}
db=helper.getWritableDatabase();
helper.resetData(db,url);
start(url);
}
/**
*获取当前任务状态
*/
publicbooleangetCurrentState(Stringurl){
returnmap.get(url).isDownLoading();
}
/**
*添加下载任务
*
*@paraminfo下载文件信息
*/
publicvoidaddTask(FileInfoinfo){
//判断数据库是否已经存在这条下载信息
if(!
helper.isExist(db,info)){
db=helper.getWritableDatabase();
helper.insertData(db,info);
map.put(info.getUrl(),info);
}else{
//从数据库获取最新的下载信息
db=helper.getReadableDatabase();
FileInfoo=helper.queryData(db,info.getUrl());
if(!
map.containsKey(info.getUrl())){
map.put(info.getUrl(),o);
}
}
}
}
五:
上面代码中OnProgressListener接口,当然还有一个最最重要的DownLoadTask了这里面就是实现了如何断点下载的,下面来一起看下里面的实现逻辑吧。
。
。
//下载进度接口
publicinterfaceOnProgressListener{
voidupdateProgress(intmax,intprogress);
}
六:
重点–下载线程
/**
*下载文件线程
*从服务器获取需要下载的文件大小
*/
publicclassDownLoadTaskextendsThread{
privateFileInfoinfo;
privateSQLiteDatabasedb;
privateDbHelperhelper;//数据库帮助类
privateintfinished=0;//当前已下载完成的进度
privateOnProgressListenerlistener;//进度回调监听
publicDownLoadTask(FileInfoinfo,DbHelperhelper,OnProgressListenerlistener){
this.info=info;
this.helper=helper;
this.db=helper.getReadableDatabase();
this.listener=listener;
info.setDownLoading(true);
}
@Override
publicvoidrun(){
getLength();
HttpURLConnectionconnection=null;
RandomAccessFilerwd=null;
try{
URLurl=newURL(info.getUrl());
connection=(HttpURLConnection)url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(3000);
//从上次下载完成的地方下载
intstart=info.getFinished();
//设置下载位置(从服务器上取要下载文件的某一段)
connection.setRequestProperty("Range","bytes="+start+"-"+info.getLength());//设置下载范围
//设置文件写入位置
Filefile=newFile(DownLoaderManger.FILE_PATH,info.getFileName());
rwd=newRandomAccessFile(file,"rwd");
//从文件的某一位置开始写入
rwd.seek(art);
finished+=info.getFinished();
if(connection.getResponseCode()==206){//文件部分下载,返回码为206
InputStreamis=connection.getInputStream();
byte[]buffer=newbyte[1024*4];
intlen;
while((len=is.read(buffer))!
=-1){
//写入文件
rwd.write(buffer,0,len);
finished+=len;
info.setFinished(finished);
//更新界面显示
Messagemsg=newMessage();
msg.what=0x123;
msg.arg1=info.getLength();
msg.arg2=info.getFinished();
handler.sendMessage(msg);
//停止下载
if(info.isStop()){
info.setDownLoading(false);
//保存此次下载的进度
helper.updateData(db,info);
db.close();
return;
}
}
//下载完成
info.setDownLoading(false);
helper.updateData(db,info);
db.close();
}
}catch(Exceptione){
e.printStackTrace();
}finally{
if(connection!
=null){
connection.disconnect();
}
try{
if(rwd!
=null){
rwd.close();
}
}catch(IOExceptione){
e.printStackTrace();
}
}
}
/**
*首先开启一个线程去获取要下载文件的大小(长度)
*/
privatevoidgetLength(){
HttpURLConnectionconnection=null;
try{
//连接网络
URLurl=newURL(info.getUrl());
connection=(HttpURLConnection)url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(3000);
inth=-1;
if(connection.getResponseCode()==200){//网络连接成功
//获得文件长度
length=connection.getContentLength();
}
if(length<=0){
//连接失败
return;
}
//创建文件保存路径
Filedir=newFile(DownLoaderManger.FILE_PATH);
if(!
dir.exists()){
dir.mkdirs();
}
info.setLength(length);
}catch(Exceptione){
e.printStackTrace();
}finally{
//释放资源
try{
if(connection!
=null){
connection.disconnect();
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
/**
*更新进度
*/
privateHandlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
case0x123:
if(listener!
=null){
listener.updateProgress(msg.arg1,msg.arg2);
}
break;
}
}
};
}
七:
下载流程—>首先获取要下载文件的总长度—>然后指定从上次结束的位置开始下载文件。
客官阅读需仔细哦,精华都在注释里面哦!
个人认为重点部分如下两个:
//设置下载位置(从服务器上取要下载文件的某一段)
connection.setRequestProperty("Range","bytes="+start+"-"+info.getLength());//设置下载范围
RandomAccessFilerwd=newRandomAccessFile(file,"rwd");
//从文件的某一位置开始写入
rwd.seek(start);
八:
上面做了一系列准备工作之后,就可以正式开始下载了让我们一起来瞧瞧
1.给主布局界面放两个按钮,来开始/暂停/重新下载
xmlversion="1.0"encoding="utf-8"?
>
android=" xmlns: tools=" android: id="@+id/activity_main" android: layout_width="match_parent" android: layout_height="match_parent" android: orientation="vertical" android: paddingBottom="@dimen/activity_vertical_margin" android: paddingLeft="@dimen/activity_horizontal_margin" android: paddingRight="@dimen/activity_horizontal_margin" android: paddingTop="@dimen/activity_vertical_margin" tools: context="com.azhong.downloader.MainActivity"> android: id="@+id/pb" android: layout_width="match_parent" android: layout_height="wrap_content"/>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android网络编程之文件断点下载暂停 继续 重新下载 Android 网络 编程 文件 断点 下载 暂停 重新
![提示](https://static.bdocx.com/images/bang_tan.gif)