2011-11-15 63 views
-2

我一直在試圖解決這個問題,但是無濟於事。從本質上講,我在做什麼是這樣的:停止下載時,互聯網不工作?

  • 開始爲每一個文件名的服務在Array
  • 服務放在一個隊列中,它們被處理一次一個 - 每個服務下載文件從服務器< ==問題是在這裏

當我下載文件有時上網的手機,尤其是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: 下載進度:1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 6 6 6 6 6 7 7 7 7 7 8 8 8 8 9 9 9 9 9 9 9 10 10 10 10 10 10 10 ... 100

然後文件2類似的東西: 下載進度:1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 6 6 6 6 6 7 7 7 7 8 8 8 8 9 9 9 9 9 9 9 10 10 10 10 10 10 10 ... 100

和讓我們說文件3的互聯網將下降(不斷開,只是網頁不會加載) ,我得到這樣的事情: 文件3: 8 8 8 8 8 9 9 9 9 9 9 9(互聯網出現故障,卡在9)

如何添加一個方法來檢查何時發生這種情況,以便我可以停止服務!

我真的需要緊急幫助,感謝您的時間!

編輯: 這是我在下載文件時因特網卡時得到的LOG。你可以看到的下載已經達到了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 
+0

首先,你確定要用Service來做到這一點,而不是AsyncTask或threadpool?您是否使用IntentService或自己處理服務中的線程?開始服務100次下載100個文件對我來說看起來不合理。 – yorkw

+0

我正在使用我自己的服務實現。我有一個線程可以控制一個持有下載的隊列。它工作正常,這不是問題,問題是當互聯網不可訪問時(當仍然連接到網絡時)如何停止服務 – bytebiscuit

回答

1

Line input.read(data)將在連接丟失時給出IOException。 確保在執行這些讀取操作時捕獲異常。

+0

是的,我正在捕捉異常。正如我所提到的,這不是連接丟失的情況。當設備連接到互聯網但網頁和http請求不起作用時就是這種情況。 – bytebiscuit

1

在撥打connect()之前,您需要做的是在您的connexion對象上撥打setReadTimeout()。這會導致底層套接字read(...)調用在時間太長時引發異常。選擇一個對應於您的互聯網概念沒有工作的超時。

假設,如果您有可靠的方式檢測「互聯網不工作」,您可以讓另一個線程進入並關閉流。我認爲這將解除阻塞在剛剛關閉的流上的read(...)調用中被阻止的線程。


請記住,這是不可能區分先驗短暫中斷(例如一個當你出了電梯後,將解決本身)和長個之間。

+0

我正在考慮有一些線程或只是一個例程,檢查downloadProgress變量的值。如果這個值保持不變,比如說20秒,那麼我知道互聯網被卡住了,我終止了服務,但我不知道該怎麼做! – bytebiscuit

+0

@ user967232 - 我的答案爲您提供了一種方法來做到這一點(第2段)。 –

+0

是通過關閉流,它會導致一個異常下一次讀試圖運行,對吧?這樣我就可以做些事情。但是,如果我檢測到互聯網無法正常工作,我該如何獲取該部分。 – bytebiscuit

相關問題