【问题标题】:What are best practices for snappy mobile I/O on slow connections?在慢速连接上快速移动 I/O 的最佳实践是什么?
【发布时间】:2011-03-28 18:24:58
【问题描述】:

我有一个移动应用程序,它是由数据驱动的,虽然只是通过文本和图像。 在当前版本中,每次点击或触摸都需要从服务器(appache/php)中提取新数据。由于网络延迟,第一个内容出现很容易需要 1-2 秒,这太长了。

我听说过并考虑过以下选项,但不确定其中一些是否会适得其反,或者我是否遗漏了一些重要的东西?

  • 从一开始就下载所有数据,并带有加载屏幕?
  • 在后台运行预取线程,预测和下载用户可能需要的数据?
  • 始终保持与服务器的连接打开?
  • 在不同的连接中并行加载不同部分的数据? (类似于脸书)
  • 使用大量数据压缩?

一篇关于这个问题的综合文章也是一个很好的答案。

【问题讨论】:

    标签: iphone android networking caching mobile


    【解决方案1】:

    我会说这些建议中的大部分都是......相当平均的。除了使用压缩。绝对在您使用的 Web 服务器上启用压缩。您绝对希望保持连接打开或拥有多个连接。移动设备最大的问题是延迟,而不是带宽,因此使用多个连接无济于事,但会很快耗尽电池电量。至于保持连接打开,甚至不要考虑这样做。这是移动开发的最大假设之一 - 仅在需要时保持连接打开。

    移动瘦客户端的经验法则是在绝对必要时下载尽可能少的数据。以下是一些提示:

    • 不要随数据发送太多元数据。如果是 JSON,请考虑更改结构,以免发送每条记录的字段名称。以下面的 JSON 为例:
    {
     success: true,
     data:[
       {ProductName: "Coca-Cola can", Weight: 380, imageUrl: "http://path.to/image.png"},
       {ProductName: "Gillete deodarant", Weight: 500, imageUrl: "http://path.to/image.png"}
     ]
    }
    

    正如您所见,有很多重复的字段名称,您可以像这样去掉那些以减少有效负载:

    {
     success: true,
     fields: {"ProductName": 0, "Weight" : 1, "imageUrl": 2}
     data:[
       ["Coca-Cola can", 380, "http://path.to/image.png"],
       ["Gillete deodarant", 500, "http://path.to/image.png"]
     ]
    }
    
    • 减少每次发送的数据量。不要一次为 10 个屏幕发送足够的数据。提供两三个屏幕,并使用无限滚动或某种分页。

    • 调查 HTTP 缓存。确保设置了缓存标头,并确保您使用的 Web 客户端尊重这些标头。

    • 积极缓存。查看任何适用于 iPhone/Android 的 Twitter 客户端。他们不会在每次启动时下载全部可见的推文,而是存储在本地。

    【讨论】:

    • 感谢您的精彩回答!如果“移动设备的最大问题是延迟而不是带宽”,我能问你为什么保持连接打开是不好的吗?我也很想深入研究 twitter-droid 代码。我看看能不能找到。
    • 因为打开的连接会很快耗尽电池电量。无论您打开多少个连接,您仍然会遇到延迟问题。
    • 我真的应该说带宽和延迟都是一个问题,因此一个连接很容易使可用带宽饱和。 SDK 甚至可能不允许您同时打开与同一服务器的连接。
    • 对,我明白了关于同时连接的要点。现在我只考虑一个打开的连接,所以我不必为每个用户操作发送 http 请求。
    • 你绝对不想那样做。开路连接会显着耗尽电池电量。如果您不需要连接,即使是 10 秒,也请关闭它。否则你最终会得到一个耗电的应用程序和许多不满意的用户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 2016-08-12
    • 2023-03-14
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多