您的位置:首页 > 理论基础 > 计算机网络

Android杂谈(24)Service+BroadcastReceiver+数据库+HttpURLConnection实现断点续传(下)

2017-06-24 14:48 453 查看
转载请注意:http://blog.csdn.net/wjzj000/article/details/73691908

本菜开源的一个自己写的Demo,希望能给Androider们有所帮助,水平有限,见谅见谅…

https://github.com/zhiaixinyang/PersonalCollect (拆解GitHub上的优秀框架于一体,全部拆离不含任何额外的库导入)

https://github.com/zhiaixinyang/MyFirstApp(Retrofit+RxJava+MVP)

写在前面

这篇博客如题目一样是接上篇的续集。上部分主要是梳理了断点续传的整体逻辑。

上篇博客链接:http://blog.csdn.net/wjzj000/article/details/73658491

本篇是收尾上篇博客因为篇幅过长没有写完的内容。

开始

上篇博客留下了一下没有填的坑,那么就让我们在接下来的文字当中,挖个坑,埋点土,数个12345…

上篇博客并没有提到如果我们想要暂停然后在重新开始该怎么办,那么这里我们将展开这个内容。

断点续传

//通过setAction中ACTION_PAUSE变量告诉Service进行暂停操作
intent.setAction(DownloadService.ACTION_PAUSE);
intent.putExtra("fileinfo", fileInfo);
startService(intent);


Service接到ACTION_PASUE这个变量之后将执行:

else if (ACTION_PAUSE.equals(intent.getAction())) {
if (mDownloadTask != null) {
mDownloadTask.isPause = true;
}
}


这里是让DownloadTask这个类中的isPause这个变量置为true。

在我们的下载线程DownloadThread中的run方法中为对这个isPause进行判断:

if (isPause) {
mThreadDAO.updateThread(mFileInfo.getUrl(), mFileInfo.getId(), mFinished);
return;
}


如果isPause为ture则保存线程的状态信息,并且return,终止下载。当我们想重新开始下载的时候,重新调用startService:

intent.setAction(DownloadService.ACTION_START);
intent.putExtra("fileinfo", fileInfo);
startService(intent);


然后我们整个过程开始重新来。通过FileInfo传递URL,然后通过InitThread获取下载文件信息,启动DownloadTask并传递FileInfo,通过FileInfo封装的信息在数据库中查找是否有之前使用过ThreadInfo。有的话拿出之前的ThreadInfo信息继续下载。

Ok,这样我们的中断重新下载就实现完毕了。

数据库

数据库的操作只是不同的增删改查,没有什么特别的地方。

按正常的使用流程是
extends SQLiteOpenHelper
重写
onCreate
onUpgrade
方法。调用
db.execSQL
执行SQL语句,完成数据库的创建。

然后就是封装一个数据库的操作类,也就是DAO类。这个类的构造方法我们一般会初始化
extends SQLiteOpenHelper
的那个类。

插入

SQLiteDatabase db = myDBHelper.getWritableDatabase();
db.execSQL("insert into thread_info(thread_id,url,start,end,finished) values(?,?,?,?,?)",new Object[]{threadInfo.getId(), threadInfo.getUrl(),threadInfo.getStart(), threadInfo.getEnd(),threadInfo.getFinish()});
db.close();


删除

SQLiteDatabase db = myDBHelper.getWritableDatabase();
db.execSQL("delete from  thread_info where url = ? and thread_id=?",new Object[]{url, thread_id});
db.close();


更新

SQLiteDatabase db = myDBHelper.getWritableDatabase();
db.execSQL("update thread_info set finished = ?  where url = ? and thread_id=?",new Object[]{finished, url, thread_id});
db.close();


查找

public List<ThreadInfo> getThread(String url) {
Log.e("getThread: ", "getThread");
List<ThreadInfo> list = new ArrayList<>();
SQLiteDatabase db = myDBHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("select * from thread_info where url=?", new String[]{url});
while (cursor.moveToNext()) {
ThreadInfo thread = new ThreadInfo();
thread.setId(cursor.getInt(cursor.getColumnIndex("thread_id")));
thread.setUrl(cursor.getString(cursor.getColumnIndex("url")));
thread.setStart(cursor.getLong(cursor.getColumnIndex("start")));
thread.setEnd(cursor.getLong(cursor.getColumnIndex("end")));
thread.setFinish(cursor.getLong(cursor.getColumnIndex("finished")));
list.add(thread);
}
cursor.close();
db.close();
return list;
}


坑到这里就填的差不多了,如果以后发现什么要补充的点就再回过头来进行更新吧。

尾声

最后希望各位看官可以star我的GitHub,三叩九拜,满地打滚求star:

https://github.com/zhiaixinyang/PersonalCollect

https://github.com/zhiaixinyang/MyFirstApp
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息