Java 互联网不工作时停止下载?
几天来我一直在试图解决这个问题,但都没有用。基本上,我所做的是:Java 互联网不工作时停止下载?,java,android,Java,Android,几天来我一直在试图解决这个问题,但都没有用。基本上,我所做的是: 为数组中的每个文件名启动服务 服务被放入队列中,并一次处理一个服务 -每个服务从服务器下载一个文件
- 为数组中的每个文件名启动服务
- 服务被放入队列中,并一次处理一个服务 -每个服务从服务器下载一个文件<==问题就在这里
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()方法可能更容易实现。你为什么不试试呢?