android 细数断点续传的坑

android项目中,不可避免会下载一些第三方应用,或者自身更新的包,或者下载视频文件,那么都会考虑用到断线续传的方式。



那么,断电续传的方式大概有3种:

1.比如下载视频的时候,调用js的方法,把文件下载下来,然后用randomAccessFile合并成一个文件。

2.如xUtils的断点续传代码,具体自己看。

3.利用sqlite,配合上randomAccessFile来实现。


第一种主要是用于下载视频,为啥呢,因为考虑到网络问题之类的,频繁的断点和续传,有概率性出现花屏等,用后面2中会出现这种问题,而前者没,而缺点是如果不会写js或者没后台工程师帮忙就不行了。

第二种和第三种的优劣性表面上可以形容为xutils的断线续传为根据文件大小就可以判断下一次的起始位置,而且下载的文件大小都可以通过eclipse中查看文件的地方看得到实时的增长。

第三种的方式可以形容为文件的大小从开始就定死了,而且会多一个数据库的调用,不考虑同步问题的话很容易出现数据库读取异常的问题,优点就是逻辑简单。


那么,坑有哪些呢?

1.网络异常,也就是自己手动断网,模拟路由或者wifi中断的情况。

xutils和randomAccessFile并没考虑到这种问题,会出现流等待网络正常才继续读取的情况,看似没事,但是实际上会大概率出现文件大小异常,拉文件出来不是解析不了就是视频花屏的情况。

2.频繁断点(几十次,10次以下概率性极小)。

xutils的情况还好。但是对于项目而言,能不使用第三方包就不用,因为实用第三方包的话不能排除第三方包有后门的问题。

而使用randomAccessFile的话,频繁断点,会有小概率的异常事件,不外乎2种:

1)文件大小异常。

2)文件解析异常。比如apk文件,正常的话可以在文件管理器看到一个有自己logo的apk,而失败会出现解析包失败,logo为android本身的logo

解决的方法很简单。

就是在进度大于等于100%时,读取当前apk文件的MD5值,也就是根据MessageDigest来获取并转换为md5值,再与网络获取的md5比较。

如果正常则打开文件,失败则直接重新下载。


当然还要看自己的具体情况来实现这个功能,下载文件大,或者文件为视频,应考虑使用项目内嵌js的方式,由js来实现暂停或者继续下载的功能,项目小可以直接考虑xutils,当出现网络异常的情况直接通过广播来手动控制暂停,网络正常才继续下载这个文件,从而减少异常情况的出现。


谢谢!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值