Java 互联网不工作时停止下载?

Java 互联网不工作时停止下载?,java,android,Java,Android,几天来我一直在试图解决这个问题,但都没有用。基本上,我所做的是: 为数组中的每个文件名启动服务 服务被放入队列中,并一次处理一个服务 -每个服务从服务器下载一个文件

几天来我一直在试图解决这个问题,但都没有用。基本上,我所做的是:

  • 为数组中的每个文件名启动服务
  • 服务被放入队列中,并一次处理一个服务 -每个服务从服务器下载一个文件<==问题就在这里
当我下载一个文件时,有时通过手机上网,尤其是WIFI,它没有响应,页面没有加载,下载停止或被卡住,比如说25%。现在我想知道这是什么时候发生的,这样我就可以停止服务,并且已经尝试了好几天了,但是没有任何效果。这就是我到目前为止所做的:

 URL url = new URL(full_url);
 HttpURLConnection conexion = (HttpURLConnection)url.openConnection();
 //conexion.setConnectTimeout(10000);
 conexion.connect();


    while ((count = input.read(data)) > 0 && lenghtOfFile > 0){
               total += count;
               downloadProgress = (int)((total*100)/lenghtOfFile);
               Log.e("downloadProgress","" + downloadProgress);
               output.write(data, 0, count);

    } 
这是我在下载文件时通常得到的: 文件1: 下载进度:11 11 12 2 2 2 2 3 3 3 4 4 5 5 5 6 6 6 6 7 7 7 8 8 10 10 10 10 10 10 10。。。一百

然后提交2个类似的文件: 下载进度:11 11 12 2 2 2 2 3 3 3 4 4 5 5 5 6 6 6 6 7 7 7 8 8 10 10 10 10 10 10 10。。。一百

假设在文件3中,互联网将关闭(不是断开连接,只是页面不会加载) 我得到了这样的结果: 文件3: 1 1 1 1 1 1 2 2 2 2 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7 8 8 8 8 9 9 9 9 9 9(互联网瘫痪,9点卡住)

我如何添加一个方法来检查何时发生这种情况,以便我可以停止服务

我真的需要紧急帮助,谢谢你的时间

编辑: 这是我在下载文件时遇到互联网堵塞时得到的日志。如你所见,下载量已达到29%,然后互联网连接在某种程度上变得无响应,它不会抛出任何异常,只是保持这样

11-16 16:18:39.769: ERROR/totaltotal(24691): 29
11-16 16:18:39.859: ERROR/totaltotal(24691): 29
11-16 16:18:39.869: ERROR/totaltotal(24691): 29
11-16 16:18:39.869: ERROR/totaltotal(24691): 29
11-16 16:18:39.879: ERROR/totaltotal(24691): 29
11-16 16:19:04.119: DEBUG/ConnectivityService(162): reportNetworkCondition(1, 0)
11-16 16:19:04.119: DEBUG/ConnectivityService(162): Inet connectivity change, net=1, condition=0,mActiveDefaultNetwork=1
11-16 16:19:04.119: DEBUG/ConnectivityService(162): starting a change hold
11-16 16:19:05.940: DEBUG/BatteryService(162): update start
11-16 16:19:05.940: DEBUG/BatteryService(162): update start
11-16 16:19:05.950: DEBUG/BatteryService(162): update start
11-16 16:19:07.129: DEBUG/ConnectivityService(162): Inet hold end, net=1, condition =0, published condition =0
11-16 16:19:07.129: DEBUG/ConnectivityService(162): no change in condition - aborting
11-16 16:19:15.959: DEBUG/BatteryService(162): update start
11-16 16:19:15.959: DEBUG/BatteryService(162): update start
11-16 16:19:15.969: DEBUG/BatteryService(162): update start
11-16 16:19:25.979: DEBUG/BatteryService(162): update start
11-16 16:19:25.979: DEBUG/BatteryService(162): update start
11-16 16:19:25.989: DEBUG/BatteryService(162): update start
Line input.read(数据)将在连接丢失时发出IOException。
确保在执行这些读取时捕获异常。

在调用
connect()
之前,您需要在
connexion
对象上调用
setReadTimeout()
。这将导致底层套接字
read(…)
调用在花费太长时间时引发异常。选择一个与您认为互联网不工作的概念相对应的超时

假设,如果你有一个可靠的方法来检测“互联网不工作”,你可以让另一个线程进入并关闭流。我认为这将解锁在刚刚关闭的流上的
read(…)
调用中被阻塞的线程



请记住,短期停机(例如,当您离开电梯时会自行解决的停机)和长期停机之间是无法区分的

首先,您确定要使用服务而不是AsyncTask或threadpool来执行此操作吗?您是否自己在服务中使用IntentService或handle thread?启动服务100次下载100个文件对我来说不合理。我正在使用我自己的服务实现。我有一个线程,它控制一个保存下载的队列。它工作正常,这不是问题所在,问题是当互联网无法访问时(仍连接到网络时)如何停止服务是的,我发现了异常。正如我提到的,这不是连接丢失的情况。当设备连接到internet但网页和http请求不起作用时,就是这种情况。我正在考虑使用一些线程或只是一个例程来检查downloadProgress变量的值。如果这个值保持不变,比如说20秒,那么我知道互联网被卡住了,我结束了服务,但我不知道怎么做@user967232-我的答案为您提供了一种方法(第2段)。是的,关闭流会在下次read尝试运行时导致异常,对吗?这样我就能做点什么了。但是,我如何才能检测到互联网是否正常工作呢?我正在想办法以某种方式监控可变的下载进度。如果该变量在一个值上保持不变至少20秒或更长时间,我将关闭流并结束服务,但我如何监控变量downloadProgress.No。我认为关闭另一个线程中的连接会导致当前读取失败并出现异常。但是setReadTimeout()方法可能更容易实现。你为什么不试试呢?