下载到99.5卡顿问题定位结论

近日升级包下载过程中发现一例问题:升级包下载到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;

                    }

原文地址:https://www.cnblogs.com/huamaoenjoy/p/5123474.html