[1]前言:
之前写了一篇名为《Android中实现多线程下载的两种方式示例及浅析之一(无断点续传)》的博客,是自己在借鉴别人思路基础之上实现的没有断点续传功能的多线程下载demo,一直都想写一个断点续传来完善下载功能,但是苦于不懂思路。前几天在一个前辈的csdn博客里面看到了相关的介绍,很棒的是他开放了他的源码,所以我下载研究了一下,理解了博主的实现思路。然后我就开始动手在理解的基础上去实现,我在很多地方借鉴了他的,但是还是有很多地方不一样。
《Android中实现多线程下载的两种方式示例及浅析之一(无断点续传)》里面提到的两种方式,我这里只写了Thread断点,因为马上要找工作了,很多东西还不会,所以没有时间去实现Runnable断点,如果月底有时间空出来,我会完善。
[2]思路:
下载中做两件事情
(1)将下载数据写入保存文件中
(2)将当前下载进度写入SQLite数据库中。
这样,当你中断本次下载时,本次下载停留在哪个位置就记录下来了,下次继续下载同一URL指向的文件,就会读取记录从上次中断的地方继续下载。
[3]结构:
一共有包括Activity在内的5个类,一个接口。
Bean类—负责操作数据库,将对数据库的增删改查都封装在这个类中,这个类中有一个成员变量OpenHelper。
OpenHelper类—SQLiteOpenHelper的子类,负责创建和初始化某数据库,在这个类中只要重写三个方法:构造方法,onCreate方法,onUpgrade方法,其中onCreate()方法会被回调来创建构造方法指定的数据库,并且同时会初始化该数据库的表结构,所以你要在这个方法里面使用SQL语句创建表,onUpgrade()方法回调的情况我还不是很清楚,之后我会写一篇博客来研究一下。
关于SQLiteOpenHelper类我再多说两句,就是当你创建了一个openHelper子类的对象后,初次调用.getWritableDatabase()得到一个可读写的数据库对象时候,Android系统会检查该数据库是否存在,如果不存在就会创建一个数据库XXX.db,然后回调openHelper子类对象的onCreate()方法去创建表,然后把这个初始化好表结构的数据库作为.getWritableDatabase()的返回值。之后再调用.getWritableDatabase()就不会执行这些操作了,以上操作只在初次调用时候做。
SingleThread类—-单个下载线程,负责根据指定URL创建输入流,根据指定保存文件创建随机流写入文件,要用随机流是因为可以使用seek方法来从指定位置写入。在下载过程中还要将当前已下载长度写入上面建立的数据库表中。
FileDownloader类—文件下载器,用于控制多线程下载和暂停,多个线程的创建和初始化。但是因为建立URL连接需要在子线程中完成,而不是在UI线程中,而这个类不是Thread的子类,所以需要在一个子线程中创建该类。
MainActivity类—在这个demo中主要负责界面响应,创建一个handler,创建一个子线程创建FileDownloader执行下载。
DownloadProgressListener接口—下载进度监听者,用于更新界面。
[4]问题与解决小记:
1)在调用语句bean=new Bean(context,”log.db”,0);时候,我指定的数据库版本为0,但是运行总是出错,不明原因。后来该为1,运行就正常了。所以数据库版本不可以指定为0. 小问题~~
2)开始写代码没有考虑到建立URL连接要放到子线程中,直接创建了FileDownloader就运行了。傻!
还有很多问题,记不得了。。。。就这样了!