在 Android 中对大型动态图像使用 img-ngsrc 会导致未来的 HTTP 请求在等待状态中排队
using img-ngsrc in Android for large dynamic images is causing future HTTP requests to get queued in pending state
我正在使用 ionic 开发 Angular JS 应用程序。对于 android,我使用人行横道以获得更好的性能。
我注意到当 运行 在 Android 上时,我遇到了 HTTP 请求在尝试加载大图像时卡住的问题 - 如果任何请求得到 "stuck" --即没有错误,但在我的 chrome 开发人员检查器中,我将 http 请求视为 "pending" —— 然后所有后续请求也进入 "pending" 状态。 iOS
不存在这个问题
代码非常简单:
<span ng-repeat="monitor in monitors">
<img ng-src="http://server.com/monitorId=monitor?view=jpg" />
</span>
这导致大约 6 个 GET 大小为 600x400 的图像并且图像不断变化(服务器不断变化图像)
我在 Android 中特别观察到的是,在几次成功的迭代之后,这个 img ng-src 背后的网络 HTTP GET 像我上面说的那样陷入待处理状态,然后所有后续 HTTP 请求也得到进入待定状态,其中 none 曾经脱离该状态。
我猜网络队列已满,这是某种限制。
那么我该如何解决这个问题呢?
a) 我能想到的一种方法是设置超时——但 ng-src 似乎没有超时功能。我的想法是超时,http 请求会取消 - 就像在正常的 $http.get 函数中一样,这应该有所帮助。
b) 也许有一种方法可以刷新所有 http 请求。我在 SO 中看到,有人创建了一个需要在此处添加的新指令: --> 但这需要我用这个新指令替换 http --> 当我使用 img ng-src
c) a 和 c 都不理想。我想知道到底发生了什么——为什么 Android 对此犹豫不决而 iOS 却没有(将 Galaxy S3 与 iPhone 5s 进行比较)。因此,如果您有任何其他解决方案,我很乐意听取他们的意见
谢谢
哇,真是一门学问。我设法实施了解决方法。
编辑:对于那些认为这是由于 6 个连接的限制的人 - 请通过 https://code.google.com/p/chromium/issues/detail?id=234779
具体问题是 Chrome(至少在人行横道上,一般情况下可能 chrome)如果您打开多个长时间不关闭的 HTTP 连接流,就会出现问题.在我的例子中,"img-src" 指向服务器每秒更改 3 次的图像 URL。下载每张图片需要一两秒钟,因此数据不断流入。
这让 Chrome 头晕目眩,在第一个待处理的 HTTP 请求之后,它开始进入一个永恒的待处理循环 - 甚至是不相关的 HTTP 请求
幸运的是,我设法实现了一个解决方法:服务器可以选择只获取一个图像(不是动态的)。我使用了 URL 并在该控制器中实现了一个 $interval 计时器,该计时器每秒刷新一次 URL - 每秒有效地检索图像(或我想要的任何其他计时器值)
Chrome 以这种方式处理 HTTP 请求没有问题,因为它们正在按预期关闭,即使这意味着更多 HTTP 请求。
呸。不是我想要的解决方案,但效果很好。
勇敢的 iOS 也处理得很好(它也完美地处理了原始场景)
我正在使用 ionic 开发 Angular JS 应用程序。对于 android,我使用人行横道以获得更好的性能。
我注意到当 运行 在 Android 上时,我遇到了 HTTP 请求在尝试加载大图像时卡住的问题 - 如果任何请求得到 "stuck" --即没有错误,但在我的 chrome 开发人员检查器中,我将 http 请求视为 "pending" —— 然后所有后续请求也进入 "pending" 状态。 iOS
不存在这个问题代码非常简单:
<span ng-repeat="monitor in monitors">
<img ng-src="http://server.com/monitorId=monitor?view=jpg" />
</span>
这导致大约 6 个 GET 大小为 600x400 的图像并且图像不断变化(服务器不断变化图像)
我在 Android 中特别观察到的是,在几次成功的迭代之后,这个 img ng-src 背后的网络 HTTP GET 像我上面说的那样陷入待处理状态,然后所有后续 HTTP 请求也得到进入待定状态,其中 none 曾经脱离该状态。
我猜网络队列已满,这是某种限制。
那么我该如何解决这个问题呢?
a) 我能想到的一种方法是设置超时——但 ng-src 似乎没有超时功能。我的想法是超时,http 请求会取消 - 就像在正常的 $http.get 函数中一样,这应该有所帮助。
b) 也许有一种方法可以刷新所有 http 请求。我在 SO 中看到,有人创建了一个需要在此处添加的新指令: --> 但这需要我用这个新指令替换 http --> 当我使用 img ng-src
c) a 和 c 都不理想。我想知道到底发生了什么——为什么 Android 对此犹豫不决而 iOS 却没有(将 Galaxy S3 与 iPhone 5s 进行比较)。因此,如果您有任何其他解决方案,我很乐意听取他们的意见
谢谢
哇,真是一门学问。我设法实施了解决方法。
编辑:对于那些认为这是由于 6 个连接的限制的人 - 请通过 https://code.google.com/p/chromium/issues/detail?id=234779
具体问题是 Chrome(至少在人行横道上,一般情况下可能 chrome)如果您打开多个长时间不关闭的 HTTP 连接流,就会出现问题.在我的例子中,"img-src" 指向服务器每秒更改 3 次的图像 URL。下载每张图片需要一两秒钟,因此数据不断流入。
这让 Chrome 头晕目眩,在第一个待处理的 HTTP 请求之后,它开始进入一个永恒的待处理循环 - 甚至是不相关的 HTTP 请求
幸运的是,我设法实现了一个解决方法:服务器可以选择只获取一个图像(不是动态的)。我使用了 URL 并在该控制器中实现了一个 $interval 计时器,该计时器每秒刷新一次 URL - 每秒有效地检索图像(或我想要的任何其他计时器值)
Chrome 以这种方式处理 HTTP 请求没有问题,因为它们正在按预期关闭,即使这意味着更多 HTTP 请求。
呸。不是我想要的解决方案,但效果很好。
勇敢的 iOS 也处理得很好(它也完美地处理了原始场景)