Gau*_*ora 9 multithreading android memory-leaks socket-timeout-exception
我有一个复杂的应用程序,可以从AWS上的Web服务下载大量内容.但是,我保持SocketTimeoutException50%的时间.根据我的研究,我怀疑可能有以下原因:
GC警告.我读过文章并试图改进我的代码,但它也没有帮助.我还必须提一下,我的应用程序在后台线程中一个接一个地下载2000+ 30KB JSON文件.有效即兴发挥的建议将受到欢迎!请帮我弄清楚真正的问题.谢谢 !
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;
}
Run Code Online (Sandbox Code Playgroud)
错误日志:
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)
Run Code Online (Sandbox Code Playgroud)
我已经用了一段时间了,但是在寻找性能时确实建议阅读一篇文章:http://www.kegel.com/java/wp-javaio.html
连接超时可能是由服务器端引起的,假设您已连接到 Web 服务器,请检查您在那里收到的错误。
GC 的声明并不令人意外。这不是内存泄漏,而是Java的清理工作。来自上面的文章:
首先,如果我们查看 while 循环的第一行,我们会看到正在为正在读取的文件的每一行创建一个新的 String 对象:
while ((line = in.readLine()) != null) {
例如,这意味着对于 100,000 行文件,将创建 100,000 个 String 对象。创建大量对象会在三个方面产生成本:为对象分配空间的时间和内存、初始化对象的时间、垃圾收集对象的时间。
关于多线程,您应该提供更多的代码。您的方法是同步的,因此您至少可以避免同时对同一实例进行多次调用。乍一看,NW 代码是安全的。
我的调试策略是在收到一行输入时查看服务器端第一和第二存储时间戳,以查看是否存在间隙(传输错误)。
祝你好运
| 归档时间: |
|
| 查看次数: |
5244 次 |
| 最近记录: |