9

AWSのWebサービスからたくさんのコンテンツをダウンロードする複雑なアプリケーションがあります。しかし、私はの50%を得続けます。私の研究に基づいて、私は理由が以下のかもしれないと疑っ:接続タイムアウトためSocketTimeoutException Android

  • 時間は少ないです:私は100秒に増加したが、それでもこのエラーを取得しておきます。
  • メモリリーク:私はGC警告を得続けます。私は記事を読んでコードを改善しようとしましたが、どちらも役に立ちません。また、私のアプリはバックグラウンドスレッドで2000以上の30KBのJSONファイルを1つずつダウンロードしていることにも言及する必要があります。これを効率的に即興化する提案は、大いに歓迎されるでしょう!
  • サーバーの問題:Amazon Webサービスは信頼性が高いため、根本的な問題ではない可能性があります。
  • マルチスレッド:これはどういうわけか責任がありますか?
  • 誤ったダウンロード方法:私が非効率的な方法でダウンロードしているかどうかは疑問です。私が間違っているなら私を訂正してください。

実際の問題を理解してください。ありがとう!

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

それは私がこれで働いている間ですが、1品は、実際にパフォーマンスを探していたときに読むことをお勧めします。http://www.kegel.com/java/wp-javaio.html

接続タイムアウト可能性がありあなたがウェブサーバに接続されていると仮定して、あなたがそこで受け取ったエラーをチェックしてください。

GCステートメントは驚くべきことではありません。これはメモリリークではなく、Javaのクリーンアップです。記事の上から:

まず、私たちはwhileループの最初の行を見れば、私たちは、新しいStringオブジェクトが読み込まれているファイルのすべての行のために作成されていることを参照してください。

しばらく(( {

これは、たとえば、100,000行のファイルに対して、100,000個のStringオブジェクトが作成されることを意味します。多数のオブジェクトを作成するには、3つの方法でコストが発生します。オブジェクトにスペースを割り当てる時間とメモリ、オブジェクトを初期化する時間、オブジェクトをガーベジコレクションする時間。

マルチスレッドについては、もう少しコードを提供する必要があります。あなたのメソッドは同期されているので、少なくとも同時に同じインスタンスに対して複数の呼び出しを避ける必要があります。 NWコードは、一見して安全です。

私のデバッグ方法は、入力ラインを受信したときに、サーバー側の第1および第2のストアタイムスタンプを調べて、ギャップが発生しているかどうか(伝送エラー)を調べることです。

幸運

関連する問題