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
本篇是收尾上篇博客因为篇幅过长没有写完的内容。
上篇博客并没有提到如果我们想要暂停然后在重新开始该怎么办,那么这里我们将展开这个内容。
Service接到ACTION_PASUE这个变量之后将执行:
这里是让DownloadTask这个类中的isPause这个变量置为true。
在我们的下载线程DownloadThread中的run方法中为对这个isPause进行判断:
如果isPause为ture则保存线程的状态信息,并且return,终止下载。当我们想重新开始下载的时候,重新调用startService:
然后我们整个过程开始重新来。通过FileInfo传递URL,然后通过InitThread获取下载文件信息,启动DownloadTask并传递FileInfo,通过FileInfo封装的信息在数据库中查找是否有之前使用过ThreadInfo。有的话拿出之前的ThreadInfo信息继续下载。
Ok,这样我们的中断重新下载就实现完毕了。
按正常的使用流程是
然后就是封装一个数据库的操作类,也就是DAO类。这个类的构造方法我们一般会初始化
坑到这里就填的差不多了,如果以后发现什么要补充的点就再回过头来进行更新吧。
https://github.com/zhiaixinyang/PersonalCollect
https://github.com/zhiaixinyang/MyFirstApp
本菜开源的一个自己写的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
相关文章推荐
- Android杂谈(23)Service+BroadcastReceiver+数据库+HttpURLConnection实现断点续传(上)
- Android开发_使用HttpURLConnection实现多线程下载
- 【Android进阶】使用HttpURLConnection实现图片的下载与现显示
- android使用HttpURLConnection实现带参数文件上传
- node.js+android(使用HttpURLConnection和HttpClient)实现文件上传
- 使用HttpURLConnection实现在android客户端和服务器之间传递对象
- 关于android实现聊天: Service +BroadcastReceiver
- Android中使用HttpURLConnection和HttpClient实现GET和POST请求访问网络
- 使用HttpURLConnection实现在android客户端和服务器之间传递对象
- Android 利用Service BroadcastReceiver实现小例子
- 关于android实现聊天: Service +BroadcastReceiver
- Android 使用HttpURLConnection 实现多线程下载
- 【总结备用】Android监听网络状态实现(BroadcastReceiver + Service)
- Golang+Android(使用HttpURLConnection)实现文件上传
- Android监听网络状态实现(BroadcastReceiver + Service)
- 06_android入门_采用HttpURLConnection的POST方式实现登陆案例
- Android 使用HttpURLConnection实现多线程下载 笔记
- 使用HttpURLConnection实现在android客户端和服务器之间传递对象
- Android通过HttpURLConnection和HttpClient接口实现网络编程
- android客户端通过Get方式提交参数给服务器,使用URL和HttpURLConnection实现,以及乱码问题解决