【问题标题】:How can I make my android app receive/send data faster?如何让我的 android 应用更快地接收/发送数据?
【发布时间】:2011-08-25 02:17:28
【问题描述】:

我有一个应用程序需要在服务器之间来回传输数据,但目前速度并不令人满意。主要部分是我正在从服务器接收和解析超过 3g 的 JSON 数据(大约 200 个字符长),它完成任务的最快时间约为 5 秒,但有时需要足够长的时间才能超时(向上30 秒)。我的服务器是机架空间云服务器。

我以为我在遵循最佳做法,但在这种速度下,情况并非如此。我对所有内容都使用 AsyncTask 和相同的全局 HttpClient 变量。

你能帮我找到更好的方法吗?

我考虑过这些选项:

  • 使用 TCP 而不是 HTTP
  • 对数据进行编码以尝试减小大小(不确定这将如何工作)

我对 TCP 了解不多,但似乎开销会更少。使用 TCP 而不是 HTTP 的优缺点是什么?用手机做实用吗?

谢谢

fyi - 一旦我解决了问题,我将接受最有帮助的答案。到目前为止,我收到了一些非常棒的答案


编辑:我这样做是为了在下载时看到进度,我注意到它在很长一段时间内保持在 0%,然后很快就达到 100% - - 有人对这个新信息有什么想法吗?我正在使用带有 Froyo 的三星 Epic 可能是相关的。

【问题讨论】:

  • 你考虑过缓存数据吗?
  • 我还没到那一步,它需要检索数据并快​​速解析它
  • 我怀疑你主要是在处理网络延迟

标签: java android http mobile tcp


【解决方案1】:

TCP 只是较低级别的 HTTP,如果您真的需要性能,那么 TCP 是您应该使用的。 HTTP 更容易开发,因为它有更多的支持,并且作为开发人员更容易实现,它封装了很多东西,因此您不必自己实现它们。您的案例的开销不应该那么多。

至于 JSON 数据。检查它是否需要很长时间,java 的普通 JSON 库太慢了看看这里

http://www.cowtowncoder.com/blog/archives/2009/09/entry_326.html

调试看看是不是这样。如果它的 json 解析速度我建议你使用 gson 库。它更简洁、易于实施,而且速度要快得多。

【讨论】:

  • 谢谢,我一直在使用 JSON.org。为什么会推荐 gson 而不是杰克逊?在您链接到的排行榜上,杰克逊似乎是迄今为止最快的
  • 我一开始也是这么想的,但后来我在第 2 部分读到了这个:And yes, indeed, results look vaguely familiar (see here, for example). Considering the "bigger is better" aspect -- value measured, "tps", is number of documents read, written, or read-modify-written per second -- difference from slowest (google-gson) to fastest (Jackson) is a solid order of magnitude.
  • 看来我错了.. 我也是这么想的 =.= 删除了评论。对不起。无论如何,这是最新的结果..我还没有尝试过杰克逊,它不是默认库吗?默认的对我来说太慢了。cowtowncoder.com/perf/json-bind-2011-01-04 这是最新的结果。
  • martinadamek.com/2011/02/04/… android 上不同 json 解析器的基准
  • 感谢您的信息!而且杰克逊不是默认的解析器
【解决方案2】:

尝试使用 GZIP 压缩正在发送的数据。请注意一个完整的代码示例,但它应该能让您走上正确的道路。

Rejinderi 是对的; GSON 摇滚。

HttpGet getRequest = new HttpGet(url);
getRequest.addHeader("Accept-Encoding", "gzip");


InputStream instream = response.getEntity().getContent();
Header contentEncoding = response.getFirstHeader("Content-Encoding");
if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) {
    instream = new GZIPInputStream(instream);
}

【讨论】:

  • 有什么方法可以通过 TCP 连接使用 gzip 吗?
  • 我不知道。你用的是什么而不是HttpGet?
  • HttpPost - 我现在只传递字符串
  • 那我不明白你的问题。您仍在使用 HTTP ala HttpPost。
  • 这就是我现在使用的,但我想讨论的是使用原始 TCP 代替 HTTP 的可能性。
【解决方案3】:

听起来您需要分析应用程序以找出瓶颈所在。你说你正在发送大约 200 个字符的数据。这是微不足道的,我看不出压缩或任何与数据严格相关的东西会对如此小的数据集产生多大影响。

我认为您更有可能遇到一些通信问题,可能是尝试为每次传输建立新连接或类似的事情给您带来所有开销。

分析是解决问题的关键,其他任何事情都是在黑暗中摸索。

【讨论】:

  • 我以前从未使用过traceview,但它看起来很有帮助但有点复杂。看起来在下载我的数据的同时加载谷歌地图会产生某种效果,所以知道这绝对有帮助。
猜你喜欢
  • 2019-12-11
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 2012-12-09
  • 1970-01-01
  • 2011-10-24
  • 2012-01-20
  • 2020-07-26
相关资源
最近更新 更多