-
Notifications
You must be signed in to change notification settings - Fork 2.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
1.尝试修复由于DownloadRunnable在FetchDataTask中出现异常时,未将全部DownloadLaunchRunnal… #769
Conversation
…e创建的全部线程关闭的问题。原代码的意图是忽略该异常并重新再DownloadLaunchRunnable中重新创建,经过测试后发现,该异常会一直存在,因此没有意义,并且最终会导致socketTimeout异常,具体原因不明。 2.尝试修复由于DownloadLaunchRunnable因为子线程上抛异常时退出,handlerThread死亡后无法回调error,导致DownloadTask状态异常而重新下载的问题。原代码中因为pause的flag而忽略异常的判断会导致异常无法正确回调,故增加判断,保证onerror能正确回调并回收线程。 具体代码可能有些不合适,还请大佬验证。
感谢PR。。不过我有几点疑惑: 1. 原代码的意图是忽略该异常并重新再DownloadLaunchRunnable中重新创建,经过测试后发现,该异常会一直存在,因此没有意义这个原代码在 2.尝试修复由于DownloadLaunchRunnable因为子线程上抛异常时退出,handlerThread死亡后无法回调error,导致DownloadTask状态异常而重新下载的问题。原代码中因为pause的flag而忽略异常的判断会导致异常无法正确回调,故增加判断,保证onerror能正确回调并回收线程。这个我不是很理解,在 |
@Jacksgong 目前比较奇怪的是抛出来的异常,error message为null,我定位到的抛出异常的位置为FetchDataTask#run的inputStream.read(buff),但是上层似乎是直接当成SocketTimeout异常捕获了,并且从日志中得出DownloadLaunchRunnable的lifecycle over调用了。 如果无法模拟恶劣网络状态的话,我建议你可以采用手动随机抛异常的方式尝试模拟一下。 |
嗯,首先需要确定下代码是否在master最新代码上对吗(1.6.5),因为1.5.0之后有一个版本这块有点问题,后来很快紧急修复了。 为了便于描述,下面将 I. 目前比较奇怪的是抛出来的异常,error message为null,我定位到的抛出异常的位置为FetchDataTask#run的inputStream.read(buff),但是上层似乎是直接当成SocketTimeout异常捕获了说明就是一个写入时的 II. 并且从日子中得出DownloadLaunchRunnable的lifecycle over调用了。这个我不是很理解, III. 我使用原库时,断点续传失败时,出现了的日志为
|
感谢大佬在百忙之中抽出时间来解答。 首先我确定使用的库是最新的代码,直接从master分支fork过来的。 第一个问题已经了解了。 第二个问题是我的表述有些问题,实际指的是 第三个问题 目前我修改的部分的思路是当异常抛出时,杀死宿主线程和所有子线程来保证不会回调onProgress,但是似乎不能完全奏效,低概率依然会出现,因为我们公司的网络状况确实极差。(但是或许也能让代码能够暴露出一些平时见不到的问题 笑~~ :-D) 增加deleteThread的接口即是为了实现这个目的。 另外一个是在DownloadLaunchRunnable#onError中增加了判断 if (paused && (model.getStatus() == FileDownloadStatus.error || model.getStatus() == FileDownloadStatus.paused)) 保证即使回调onProgress把onError状态刷新掉了,还是能够回调onError接口处理异常。不过不能完全奏效。 第四个问题 低概率事件指的是经过Pr修改后的代码,如果是master分支的源代码,出现这个问题的几率非常高。几乎每次都会重新下载。 关于为什么出现,我在上述第三个问题已经阐明了,只是因为异步线程流程无法确认导致目前我还不能完全定位,后续我会尝试精确跟踪每个线程的流程和生命周期,尝试发现问题。由于问题不是稳定复现,所以调试难度较大,后续的问题我还会继续跟进,直到这个问题解决为止。 |
@BigExcalibur 不好意思,由于我自己也不满意这个库,有些地方复杂度太高了,整个核心库不够单一,单元测试覆盖极少等问题,导致PR很少,线上容易存在边界问题难以发现,因此这段事件我一直在重新编写新库,耽搁了时间,望见谅。 I. 第二个问题这段日志,因为DownloadTaskHunter这个类目前的作用我还不太明了。
II. 第三个问题我目前还没有完全确认是handler未回调onError的问题还是onProgress回调覆盖了error状态的原因我检查了下确实有可能 III. 第四个问题谢谢支持哈~ |
1.尝试修复由于DownloadRunnable在FetchDataTask中出现异常时,未将全部DownloadLaunchRunnable创建的全部线程关闭的问题。原代码的意图是忽略该异常并重新再DownloadLaunchRunnable中重新创建,经过测试后发现,该异常会一直存在,因此没有意义,并且最终会导致socketTimeout异常,具体原因不明。
2.尝试修复由于DownloadLaunchRunnable因为子线程上抛异常时退出,handlerThread死亡后无法回调error,导致DownloadTask状态异常而重新下载的问题。原代码中因为pause的flag而忽略异常的判断会导致异常无法正确回调,故增加判断,保证onerror能正确回调并回收线程。
具体代码可能有些不合适,还请大佬验证。修改后的代码经过测试,目前可以解决在恶劣网络状况下会频繁重新下载的问题。