各位亲 有时间可以去看看我的 “金骏家居淘宝店” http://jinjun1688.taobao.com/shop/view_shop.htm?tracelog=twddp 买时说明在我的博客看到有优惠哦 还有意外礼品赠送 真正的程序员淘宝店
名目配景:
近来jwisp在做OMA-DM的android终端侧,要实现的性能包括FUMO, SCOMO下载办理.因为名目是基于funambol的开源代码,在实现FUMO和SCOMO时,操作了libcurl的库来实现下载效劳测的指定文件,下载后实现android固件晋级或android使用下载安装性能,最后将FUMO/SCOMO的下载安装成果上报给效劳端.
必要配景 :
下载流程比力简略, 操作curl_easy_perform即可实现残破的下载流程,安装后, 操作OMA DM协定上报给平台侧.然而jwisp这里的必要还有两个异样情况需求解决:
1. 下载进程中,遇手机忽然掉电(操纵:扣电池), android终端再次启动后应能复原现场而后被动下载,下载模式为提倡断点续传
2. 下载进程中信号中缀,中缀工夫在5分钟之内,终端应实验从新衔接, 衔接次数在3次以上.从新衔接后提倡操作断点续传模式继续下载.
然而在操作libcurl时, jwisp发现, curl_easy_perform是阻塞的模式停止下载的, curl_easy_perform执行后,顺序会在这里阻塞期待下载完毕(胜利完毕或许失败完毕).此时若反常下载一段工夫后, 停止网络中缀, curl_easy_perform并不会前往失败,而是阻塞整个顺序卡在这里, 此时即使网络衔接从新复原, curl_easy_perform也无奈复原继续下载,招致整个顺序呈现”死机”外形.
然而若先断网, 而后停止curl_easy_perform的话,会间接前往失败, 不会阻塞
在网上搜寻后发现, 大家在网上遇到这个效果的很多,然而处置方法很少, 下面jwisp就把网上提倡的可能操作的处置方法列举:
1. 操作multi形式下载,而倒霉用easy形式,此方法的惟一好处就是multi并不会阻塞,而是立即前往.然而缺陷是带来了效果,其一就是需求本身去阻塞, 当咱们需求前往时再前往,其二还需求启动一个线程, 需求本身管制整个进程的节拍.
2. 在下载中,另起一个线程, 若发现下载外形卡死(可能通过活期反省文件大小来实现),则从内部中缀下载线程. 此方法需另起线程,并且间接中缀线程, 会给整个顺序带来不巩固.
在实验操作网上的方法失败后, jwisp终于设计出了本身的打算,并完满处置信号中缀异样, 下载中掉电异样,断点续传等效果. 而且此打算不需求启动任何另外的线程,不需求手动停止阻塞, 在信号中缀后,复原衔接最快可在0.5秒内复原下载.而且复原下载模式全副为断点续传.
主要的设计思路如下, 下载进程中,设置超时工夫为30秒, 30秒后若下载未完成绩从新衔接停止下载(这个可处置卡死效果),每次下载时停止判别, 若不是初次下载则获得当前已下载文件大小,从该大小处停止续传, 若网络仍处于断开外形,再次衔接会立即前往失败, 此时让当前线程期待0.5秒后停止衔接(这个可能处置瞬间复原衔接的效果),衔接次数不逾越600次(这个用来保障5分钟后前往失败).掉电需求在顺序已启动时反省能否上次未下载完假设是, 则间接调用下载续传方法即可.这样基本上所有的效果的流程就都能顺利走上去, 而且下载进程体验好,可随时勾销.
该打算主要通过两个函数来实现, 一个担任停止断点续传和基本设置,并执行下载, 一个担任管制整个下载重试次数,前往下载成果. 而且需求留意的是,安装完成后, 应将相应的文件删除掉.
源代码在下一节附上