Skip to content
冉天华 edited this page Feb 7, 2018 · 16 revisions
  • Get Tasks List? "unbind" Activity? Manage Tasks?: Please ref here
  • Set frequence of the FileDownloadListener#progress callback: Please ref here中文-1中文-2中文-3
  • Start downloading automatically when network reconnected from disconnected state: Please ref here
  • How to import FileDownloader to the eclipse?: Please ref here
  • Dynamic Url for the same task? : please follow this issue: #224
  • getSoFar and getTotal not work correctly?: Please ref here
  • Long delay before download starts?: Please ref here

1.假如 下载进程在下载过程中被异常kill了,程序会默认自动恢复进程吗,还是需要手动写某些代码才能开启

会自动重启的。更多的可以参看: 这里,还有这里

2.在启动下载的时候,怎么判断下载服务已经启动,我想加个优化,假如下载服务未启动,则先启动下载服务再下载

在启动下载的时候,如果下载服务没有启动。默认会进入等待队列,然后自动启动服务,服务启动后,会自动开始任务。

  • 获取服务连接状态可以是: FileDownloader#isServiceConnected
  • 进行一些与服务连接有关的调用,可以通过以下方法辅助: FileDownloader#insureServiceBindFileDownloader#insureServiceBindAsyncFileDownloader#bindService(Runnable).

3. 不执行下载就无法获取sofar和total?(获取到的值都为0?)

参考这里

4. 不支持https?

支持的,具体可以参看这里

5. Connection reset by peer?

出现这个错误,表示 TCP 收到了一个 RST packet,那么当前 socket 连接已经不可用了,关于 RST packet,可以参考这里

收到服务器的 RST packet 的原因常见的有下面几种:

  • 客户端连接服务器指定端口,但是服务器该端口未打开,服务器会发送 RST packet。
  • 服务端通过 SO_RCVTIMEO 设置 TCP 接收数据包的超时时间,当超时发生时,服务器会发送一个 RST packet。
  • 服务端提前关闭了连接(一个很常见的 case 是服务器并发连接数超过了其承载量,服务器关掉了当前连接),客户端在这个连接上读取数据时,服务器会发送 RST packet。
  • RST 攻击,即攻击者伪造 RST packet,详情可参考这里

在使用 FileDownloader 的场景中,其实绝大多数是因为上述第二点或者三点造成的问题,此时问题在于服务端,需要服务端去解决,当然客户端可以通过 FileDownloader 增加重试次数,从而增加成功下载的机会,但这只是治标不治本。对于第一点,基本上不会遇到,而且从现有反馈这个 issue 的情况来看,是在下载过程中出现了异常,即连接已经正常建立过了。不过还是需要提下一个特殊的 case ,即在 DNS 被污染的情况下,有可能请求被发送到了未开启的服务端口,那么也有可能出现这个问题,此时连接都无法建立。

综上所述,出现这种错误是 TCP 层发生异常,FileDownloader 本身只是一个下载工具,不可能对 TCP 层有任何的影响,所以 FileDownloader 不是造成这个异常的原因,也不能解决这个问题,唯一能做的是增加重试次数增加下载成功的机会。绝大部分情况下,问题发生在服务端,需要服务端从根本上解决问题。