9

Ho un'app complessa che scarica molti contenuti dal mio webservice su AWS. Tuttavia, continuo a ricevere SocketTimeoutException il 50% delle volte. Sulla base della mia ricerca, ho il sospetto che ci possa essere seguenti motivi:SocketTimeoutException Android

  • Tempo per timeout di connessione è meno: ho aumentato a 100 secondi, ma ancora continuo a ricevere questo errore.
  • Perdita di memoria: Continuo a ricevere gli avvisi GC. Ho letto articoli e ho cercato di migliorare il mio codice ma non aiuta neanche. Devo anche menzionare che la mia app scarica 2000+ file JSON da 30 KB uno dopo l'altro in un thread in background. Suggerimenti per improvvisare questo in modo efficiente sarebbe molto gradito!
  • Problemi del server: Poiché Amazon Web Service è altamente affidabile, potrebbe non essere il problema sottostante.
  • Filettatura multipla: Potrebbe essere responsabile in qualche modo?
  • Errato modo di scaricare: dubito che sto scaricando in modo inefficiente. Correggimi se sbaglio.

Per favore aiutami a capire il vero problema. Grazie ! log

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; 
} 

Errore:

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) 

risposta

1

è un po 'ho lavorato con questo, ma un articolo è davvero consigliato di leggere quando alla ricerca di prestazioni: http://www.kegel.com/java/wp-javaio.html

Il timeout di connessione potrebbe essere causato dal lato server, supponendo che tu sia connesso a un server web, controlla quali errori ricevi lì.

Le dichiarazioni del GC non sono sorprendenti. Questa non è una perdita di memoria, ma la pulizia di Java. Dall'alto articolo:

In primo luogo, se guardiamo la prima linea del ciclo while, vediamo che un nuovo oggetto String viene creato per ogni riga del file in lettura:

while ((line = in.readLine())! = null) {

Ciò significa, ad esempio, che per un file di 100.000 righe verrebbero creati 100.000 oggetti String. La creazione di un numero elevato di oggetti comporta costi in tre modi: tempo e memoria per allocare lo spazio per gli oggetti, tempo per inizializzare gli oggetti, tempo per raccogliere gli oggetti.

Per quanto riguarda il threading multiplo, è necessario fornire un altro codice. Il tuo metodo è sincronizzato, quindi eviti almeno più invocazioni sulla stessa istanza allo stesso tempo. Il codice NW è, a prima vista, sicuro.

La mia strategia di debug consisterebbe nel controllare la data e l'ora del primo e del secondo negozio quando si riceve una riga di input per vedere se si verificano degli spazi vuoti (errori di trasmissione).

Buona fortuna

Problemi correlati