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

转载请注意: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重写onCreateonUpgrade方法。调用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值