转载请注意:http://blog.youkuaiyun.com/wjzj000/article/details/73691908
本菜开源的一个自己写的Demo,希望能给Androider们有所帮助,水平有限,见谅见谅…
https://github.com/zhiaixinyang/PersonalCollect (拆解GitHub上的优秀框架于一体,全部拆离不含任何额外的库导入)
https://github.com/zhiaixinyang/MyFirstApp(Retrofit+RxJava+MVP)
写在前面
这篇博客如题目一样是接上篇的续集。上部分主要是梳理了断点续传的整体逻辑。
上篇博客链接:http://blog.youkuaiyun.com/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