9

我有一個複雜的應用程序,它在AWS上從我的web服務下載大量內容。但是,我一直在獲得SocketTimeoutException 50%的時間。根據我的研究,我懷疑可能有以下幾個原因:SocketTimeoutException Android

  • 時間爲連接超時少:我把它提高到100秒,但仍不斷收到此錯誤。
  • 內存泄漏:我一直在獲取GC警告。我已閱讀文章並試圖改進我的代碼,但它也無濟於事。我還必須提到我的應用程序在後臺線程中一個接一個地下載了2000多個30KB的JSON文件。有效即興創作的建議非常受歡迎!
  • 服務器問題:由於Amazon Web Service的可靠性很高,因此可能不是基本問題。
  • 多線程:這可以負責某種方式嗎?
  • 錯誤的下載方式:我懷疑我是否以低效的方式下載。如我錯了請糾正我。

請幫我弄清楚真正的問題。謝謝 !

public synchronized String getJSONString(String url) 
{ 
    try { 
      URL url1 = new URL(url); 
      URLConnection tc = url1.openConnection(); 
      tc.setConnectTimeout(timeout); 
      tc.setReadTimeout(timeout); 
      // tc.connect(); 
      br = new BufferedReader((new InputStreamReader(tc.getInputStream())),8000); 
      while ((line = br.readLine()) != null) { 
        sb.append(line+"\n"); 
       } 
       br.close(); 
       json = sb.toString(); 
       return json; 
     } 
    catch(Exception e) 
    { 
     Log.e("JSON Downloader", "Error downloading feed/article "); 
     e.printStackTrace(); 
    } 

    return null; 
} 

錯誤日誌:

02-01 06:37:43.375: W/System.err(5548): java.net.SocketTimeoutException 
02-01 06:37:43.375: W/System.err(5548):  at java.net.PlainSocketImpl.read(PlainSocketImpl.java:491) 
02-01 06:37:43.375: W/System.err(5548):  at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46) 
02-01 06:37:43.375: W/System.err(5548):  at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240) 
02-01 06:37:43.375: W/System.err(5548):  at java.io.InputStream.read(InputStream.java:163) 
02-01 06:37:43.375: W/System.err(5548):  at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:142) 
02-01 06:37:43.375: W/System.err(5548):  at java.io.BufferedInputStream.read(BufferedInputStream.java:227) 
02-01 06:37:43.375: W/System.err(5548):  at libcore.io.Streams.readAsciiLine(Streams.java:201) 
02-01 06:37:43.375: W/System.err(5548):  at libcore.net.http.HttpEngine.readResponseHeaders(HttpEngine.java:544) 
02-01 06:37:43.375: W/System.err(5548):  at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:784) 
02-01 06:37:43.375: W/System.err(5548):  at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:274) 
02-01 06:37:43.375: W/System.err(5548):  at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 
02-01 06:37:43.375: W/System.err(5548):  at com.in.feeds.JSONDownloader.getJSONString(JSONDownloader.java:65) 
02-01 06:37:43.375: W/System.err(5548):  at com.in.feeds.JSONDownloader.getJSONObjectFromUrl(JSONDownloader.java:45) 
02-01 06:37:43.375: W/System.err(5548):  at com.in.fullarticle.ArticlePage$LoadArticle.run(ArticlePage.java:383) 
02-01 06:37:43.375: W/System.err(5548):  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442) 
02-01 06:37:43.375: W/System.err(5548):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
02-01 06:37:43.375: W/System.err(5548):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
02-01 06:37:43.375: W/System.err(5548):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
02-01 06:37:43.375: W/System.err(5548):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
02-01 06:37:43.375: W/System.err(5548):  at java.lang.Thread.run(Thread.java:856) 

回答

1

它是一個,而我有這個工作,但確實建議一文尋找業績時閱讀:http://www.kegel.com/java/wp-javaio.html

連接超時可能在服務器端引起,假設你已連接到Web服務器,請檢查你在那裏收到的錯誤。

GC語句並不令人驚訝。這不是內存泄漏,而是Java清理。從上面的文章:

首先,如果我們看一下while循環的第一線,我們看到正在對文件的每一行創建了一個新的String對象讀取:

,而(( line = in.readLine())!= null){

這意味着,例如,對於100,000行文件,將創建100,000個字符串對象。創建大量對象會產生三種成本:分配對象空間的時間和內存,初始化對象的時間,垃圾收集對象的時間。

關於多線程,您應該提供更多的代碼。你的方法是同步的,所以你至少要避免同時在同一個實例上多次調用。 NW編碼是快速瀏覽,安全。

我的調試策略是查看服務器端的第一個和第二個存儲時間戳,當您收到一行輸入以查看是否存在間隙(傳輸錯誤)。

祝你好運

相關問題