代码之家  ›  专栏  ›  技术社区  ›  Thomas Ahle

在慢速连接上快速移动I/O的最佳实践是什么?

  •  1
  • Thomas Ahle  · 技术社区  · 16 年前

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

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

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

    一篇关于这件事的综合性文章也是一个很好的答案。

    1 回复  |  直到 16 年前
        1
  •  4
  •   Igor Zevaka    16 年前

    我想说大多数建议是…相当平均。除了使用压缩。一定要在正在使用的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缓存。确保设置了缓存头,并确保正在使用的WebClient尊重这些头。

    • 高速缓存。看看任何适用于iPhone/Android的Twitter客户端。它们不会在每次启动时下载所有可见的tweet,而是存储在本地。