【问题标题】:Slow HTTPURLConnection in AndroidAndroid中的慢速HTTPURLConnection
【发布时间】:2017-10-31 23:27:49
【问题描述】:

我使用下面的代码

private String resultGET(String addr)
{
 try
 {
  String result = "";
  HttpURLConnection conn = null;
  addr = (isFull)?addr:Statics.fullURL(addr);
  try
  {
   URL url = new URL(addr);
   conn = (HttpURLConnection)url.openConnection();
   conn.setRequestMethod("GET");
   conn.setRequestProperty("User-Agent", Statics.USER_AGENT);
   InputStream ips = conn.getInputStream();

   int responseCode = conn.getResponseCode();
   if (200 != responseCode)
   {
    Feedback.setError("GET error: " + responseCode + " on " + addr); 
    return "";
   }

   BufferedReader bufr = new BufferedReader(new InputStreamReader(ips));
   String line;
   while ((line = bufr.readLine()) != null) result += line; 
   bufr.close();
  } finally{if (null != conn) conn.disconnect();} 
  return result;
 } catch(Exception e)
 {
  Feedback.setError("get fault " + Utils.stackTrace(e));    
  return "";    
 } 
}

Feedback 只是一个 Java 类,我在内部使用它来处理我发送回 Android 应用程序前端的所有消息(这是一个混合应用程序,上面的代码是我为该应用程序编写的插件的一部分) .

我发现当返回任何大量数据时,resultGETcall 会变得异常缓慢。例如,一个 43Kb 的 Javascript 文件——我后来用来通过 Duktape 运行 JS 代码需要 1 分钟的时间来下载和保存。

当谈到 Java 时,我还是个新手,所以我想我在这里做错了什么导致了这个问题。我非常感谢任何能够让我走上正轨的人。


一会儿……

我现在已经在 Android 6 设备而不是我的默认 Android 4.4.2 设备上测试了这个问题。在 Android 6 上,下载 + 文件保存速度为 5 秒。在 Android 4.4.2 上超过 40 秒。早期版本的 Android 上的 HTTPURLConnection 是否存在任何已知问题?我

【问题讨论】:

  • 尝试 Http 免费且高效的库,例如 Retrofit journaldev.com/13639/retrofit-android-example-tutorial 或 Volley code.tutsplus.com/tutorials/… 这些比您的示例更高效且性能更高
  • 我不相信那些会更快。没有理由。
  • download + file save 您没有保存到文件中。如果你这样做了,你甚至不需要 StringBuilder,但可以直接逐行写入 -buffered- FileOutputStream。
  • 是的。 resultGET 是我从多个地方调用的通用例程。有时我会在内部使用字符串结果,有时我会保存到文件中。

标签: java android http get


【解决方案1】:
  String result = "";

字符串上的 += 运算符很慢。如果您有很多行,请使用 StringBuilder sb = new StringBuilder();并使用其 append() 方法 sb.append(line + " \n");

最后你可以使用 result = sb.toString();

【讨论】:

  • 切换到 StringBuilder 将 Android 4.4.2 的性能提高了三倍 - 从 45 秒到 15 秒。在 Android 6 上,它从 5s 下降到 2.5s。不错,但仍然想要 - 在我的桌面浏览器(同一网络)上,下载会在几分之一秒内完成
  • 给遇到此线程的其他人的提示 - 为了更好地衡量,我尝试用对 OkHTTP 库的调用替换我的代码。正如@greenapps 所建议的那样,在替换StringBuilder 后,性能没有可测量的差异。如果有的话,它会多花 2 秒(在我的 Android 4.4.2 设备上是 17 秒而不是 15 秒,在我的 Android 6 设备上是 2.8 而不是 2.5 秒)。
猜你喜欢
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 2013-08-20
相关资源
最近更新 更多