首先,要明确这个程序大概的流程:
1:从Activity中创建要下载的文件实体信息,然后传入到service中进行下载,在service中是主线程,必须另外开启子线程进行下载。
2:将在子线程中下载的时候将下载的进度传回到activity中进行更新ui
一:先讲解MainActivity
初始化界面控件,然后添加相应的点击事件,stop按钮的逻辑暂未实现
首先创建了一个FileInfo实体,然后初始化他,然后把他存在intent,启动DownloadService,将他传递到service进行下载
定义的FileInfo实体:
FIleInfo定义了filename文件的名字 url要下载的问价的链接,length要下载的文件的长度。实现了Serializable接口,这样fileinfo实体就可以通过intent进行传递了。
DownloadService,首先在onStartCommand中进行接受传递来的intent,得到传过来的fileinfo实体,然后启动下载的子线程进行下载。
讲解下下载的子线程,
实现的run方法,首先是得到要下载fileinfo的url,然后打开链接,然后设置conn的请求方式和事件延迟,然后得到conn的长度,如果链接正常,得到inputstream,然后就是将网络的数据写入到本地,显示在本地创建一个目录,然后是创建要写入的文件。最后通过随机写入流进行文件的写入。设置随机写入流的长度,设置buffer缓冲区,通过while循环对文件进行写入。
然后是ui界面更新,设置lengthd,将每次下载的长度累加然后通过发送广播的方式传回到activity中进行ui的更新。为了让更新不至于太快,在while中设置每过500ms进行一次发送广播。