标签:
近日升级包下载过程中发现一例问题:升级包下载到99.5卡顿,然后报无法获取网络资源。本文对该问题的做详细定位和总结。
问题原因:下载过程中断网,由于批量写入,因此下载浮标位置更新了,而实际上有一段数据未写入。此时下载完毕了,而系统计算只有99.5左右(有一段数据丢失)。此时服务器上已经无数据可下,而系统由于见到到下载进度未到100%,还在持续刷新,刷新超过2分钟发现进度仍没有增加,因此定为网络资源的问题。
下载过程中如果出现退出下载,重新进入,系统会根据前报的进度进行继续下载,因此造成局部数据重叠,这种情况下,虽然升级包最终可以下载完毕,但是由于数据遭到破坏,因此校验不会通过。会报MD5校验失败,升级无法进一步进行。
解决方法:将写书数据库和同步下载浮标位置放在一起,避免造成数据更新不同步,断网引起的数据丢失。
解决效果:测试无误
问题代码段:
修改前:===============================================================================
while (ThreadLock.getSatus() && startPos < endPos
&& (offset) >0) {
batchBufPos += offset;
startPos += offset;
//批量写磁盘写数据库(解决实时写拖慢下载速度问题)
if ((batchBufPos + readSize ) >= writeBatchBufSize) {
Log.i(TAG,"===========================write disk and save db in...");
try {
saveFile.write(buffer, 0, batchBufPos);//更新磁盘数据
downloader.update(this.threadId, startPos);//更新map数据
downloader.saveLogFile();//更新数据库数据:position、downpath、filename、threadid
downloader.append(batchBufPos);//累加已下载数据
Log.i(TAG,"=========================== downloader.getDownloadSize() = " + downloader.getDownloadSize());
} catch (Exception e) {
e.printStackTrace();
}
//清空批量buffer
batchBufPos = 0;
}
修改后
while (ThreadLock.getSatus() && startPos < endPos
&& (offset) >0) {
batchBufPos += offset;
//批量写磁盘写数据库(解决实时写拖慢下载速度问题)
if ((batchBufPos + readSize ) >= writeBatchBufSize) {
Log.i(TAG,"===========================write disk and save db in...");
try {
saveFile.write(buffer, 0, batchBufPos);//更新磁盘数据
downloader.update(this.threadId, startPos);//更新map数据
downloader.saveLogFile();//更新数据库数据:position、downpath、filename、threadid
downloader.append(batchBufPos);//累加已下载数据
Log.i(TAG,"=========================== downloader.getDownloadSize() = " + downloader.getDownloadSize());
startPos += batchBufPos; //挪到写数据的阶段同步下载浮标
} catch (Exception e) {
e.printStackTrace();
}
//清空批量buffer
batchBufPos = 0;
}
标签:
原文地址:http://www.cnblogs.com/huamaoenjoy/p/5123474.html