9

mam złożoną aplikację, która pobiera dużo treści z mojego usługa na AWS. Jednak nadal otrzymuję 50% czasu. Na podstawie swoich badań, podejrzewam, że może być z następujących powodów:SocketTimeoutException Android

  • Czas limit czasu połączenia jest mniej: I wzrosła do 100 sekund, ale wciąż otrzymuję ten błąd.
  • Przeciek pamięci: Ciągle otrzymuję ostrzeżenia GC. Czytałem artykuły i próbowałem ulepszyć mój kod, ale to też nie pomaga. Muszę również wspomnieć, że moja aplikacja pobiera 2000 + 30KB plików JSON jeden po drugim w wątku w tle. Sugestie, aby skutecznie improwizować, byłyby bardzo mile widziane!
  • Server wystawia: Od Amazon Web Service jest wysoce niezawodny, nie może być podstawowy problem.
  • Multiple gwintowania: Czy to może być odpowiedzialny jakoś?
  • Błędny sposób pobierania: Wątpię, czy pobieram w sposób nieefektywny. Popraw mnie, jeśli się mylę.

Proszę pomóż mi znaleźć prawdziwy problem. Dzięki ! 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; 
} 

Błąd:

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) 

Odpowiedz

1

jest to, kiedy pracowałem z tym, ale jeden artykuł jest naprawdę zaleca się czytać przy poszukiwaniu usług: http://www.kegel.com/java/wp-javaio.html

limit czasu połączenia może być wywołane po stronie serwera, zakładając, że jesteś połączony z serwerem sieciowym, sprawdź, jakie błędy tam otrzymasz.

W sprawozdaniu GC nie są zaskakujące. To nie jest przeciek pamięci, ale Java się czyści. Od wyżej artykule:

Po pierwsze, jeśli spojrzymy na pierwszej linii pętli while, widzimy, że nowy obiekt String jest tworzony dla każdej linii pliku są odczytywane:

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

Oznacza to na przykład, że w przypadku pliku 100 000 wierszy zostanie utworzonych 100 000 obiektów String. Tworzenie dużej liczby obiektów wiąże się z kosztami na trzy sposoby: Czas i pamięć do przydzielenia przestrzeni dla obiektów, czas inicjalizacji obiektów, czas na zbieranie śmieci.

Jeśli chodzi o wielowątkowość, należy podać nieco więcej kodu. Twoja metoda jest zsynchronizowana, więc przynajmniej unikasz wielu wywołań w tym samym wystąpieniu w tym samym czasie. Kod NW jest w szybkim skrócie bezpieczny.

Moja strategia debugowania polegałaby na sprawdzeniu sygnatur czasowych pierwszego i drugiego sklepu po otrzymaniu linii wejściowej, aby sprawdzić, czy występują luki (błędy transmisji).

Powodzenia

Powiązane problemy