SocketTimeoutException Android

时间:2013-02-01 07:48:11

标签: android multithreading memory-leaks socket-timeout-exception

我有一个复杂的应用程序,可从AWS上的Web服务下载大量内容。但是,我在50%的时间内不断获得SocketTimeoutException。根据我的研究,我怀疑可能有以下原因:

  • 连接超时的时间较短:我将其增加到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 个答案:

答案 0 :(得分:1)

有一段时间我使用了这个,但是在寻找性能时,我们建议您阅读一篇文章:http://www.kegel.com/java/wp-javaio.html

连接超时可能是由服务器端引起的,假设您已连接到Web服务器,请检查您在那里收到的错误。

GC声明并不令人惊讶。这不是内存泄漏,而是Java清理。从上面的文章:

  

首先,如果我们查看while循环的第一行,我们会看到正在为正在读取的文件的每一行创建一个新的String对象:

     

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

     

这意味着,例如,对于100,000行文件,将创建100,000个String对象。创建大量对象会以三种方式产生成本:为对象分配空间的时间和内存,初始化对象的时间,垃圾收集对象的时间。

关于多线程,您应该提供更多代码。您的方法是同步的,因此您至少可以避免同时在同一个实例上进行多次调用。快速浏览NW代码是安全的。

我的调试策略是在收到一行输入时查看服务器端的第一个和第二个存储时间戳,以查看是否存在间隙(传输错误)。

祝你好运