多线程断点续传(一)

时间:2022-01-19 18:34:12

一、 学习内容

1、 基本UI定义
2、 数据库的操作
3、 Service的启动
4、 Activity给service传递参数
5、 使用广播回传数据到Activity
6、 线程和Handler
7、 网络操作:文件的写入,网络往本地磁盘写入
多线程断点续传(一)

二、 网络下载的具体流程图

多线程断点续传(一)

三、 网络下载的关键点

1、 获得网络文件的长度
2、 在本地创建一个文件,设置其长度
3、 从数据库中获得上次下载的进度
4、 从上次下载的位置下载数据,同时保存进度到数据库
5、 将下载进度回传Activity
6、 下载完成后删除下载信息

四、 断点续传步骤

1、 设置文件长度

1) 连接网络文件
2) 获取文件长度
3) 在本地创建文件
4) 设置文件长度

2、 断点续传

1) 将线程信息保存到数据库中
2) 设置下载位置
3) 设置文件写入位置
4) 开始下载

3、 下载文件

1) 开始下载
2) 读取数据
3) 写入文件
4) 在下载暂停时,保存下载进度
5) 把下载进度发送广播给Activity

五、 学习点

1、 startService(intent)

第一次启动的时候,会去创建service,当service已经启动后,不会再去创建,而是会把intent的参数继续传递给service,service通过onStartCommend接收参数

2、 网络操作用多线程处理

多线程断点续传(一)

3、 GET和POST方式来获取数据

多线程断点续传(一)

4、 Http请求下载

1) 设置获取实体数据的范围
conn.setRequestProperty(“Range”, “bytes=” + start + “-” + end);
2) 响应状态码
HttpStatus.SC_OK = 200

5、 RandomAccessFile

1) 在文件的任意位置进行写入操作,这样就实现了断点续传
2) RandomAccessFile raf = new RandomAccessFile(File file, String mode);

3) 文件模式mode:
多线程断点续传(一)

4) 设置文件写入位置:raf.seek(index);
多线程断点续传(一)

6、 Handler发送消息

mHandler.obtainMessage(String MSG, Object obj).sendToTarget();

六、 案例小结

1、 Activity是如何与Service进行交互的?

1) Activity通过Intent,设置action,startService传递Intent
2) Service通过onStartCommand去接收Intent
3) Service通过sendBroadcast 发送广播,通过Intent,设置action,将数据传递给Activity
4) Activity定义BroadcastReceiver广播接受者,获取Intent,根据action,将进度信息设置给Progress。
5) Activity需要创建IntentFilter筛选器,registerReceiver注册广播接受者。

2、 文件下载是如何实现的?

1) 打开网络操作的连接
2) 设置文件的下载的位置,通过Range这个属性

如果服务器没有相关的配置的话,那么getInputStream返回的数据依旧是整个文件,获得的responseCode == 200,如果配置过得responseCode == 206    ( 我在这里踩过坑 )

3) RandomAccessFile设置文件写入位置

3、 断点续传是如何实现的?

1) 断开的时候,将下载信息保存更新到数据库中
2) 续传的时候,从数据库中读取下载信息,继续下载

4、 Service在案例中起到什么作用?

1) Activity是可以被用户关闭的,被Android系统回收,如果线程开启了,Activity被关闭了,就没有办法对线程进行管理,是非常不安全的。
2) Service是后台组件,没有办法和用户交互,而且优先级级别比较高,一般不会被Android系统回收,把一下重要的事情,线程的启动和操作,放在Service中会比较安全。


【Demo】