UIWebView и поддерживать жизнь?

Я настраиваю UIWebView, чтобы показать содержимое веб-камеры через URL-адрес, который извлекает поток MPJEG.

Я узнал, что если бы я захотел переключиться на другую камеру, она выглядела бы гладко, если бы я не reset все содержимое UIWebView, а вместо этого настроил javascript-функцию на странице, загруженной в нее, чтобы заменить содержимое изображения, например:

<img id='iImage' src='about:blank'>
<script type='text/javascript'>
function show(url)
{
    iImage.src = url;
}
</script>

Если бы я этого не делал, каждый раз, когда я переключался на новый URL-адрес, UIWebView белел на секунду или два, пока новый контент не был готов к отображению, причем приведенный выше код просто заменяет содержимое напрямую, нет выделения.

Однако, если я переключаюсь между двумя видеопотоками, в какой-то момент я получаю сообщение об ошибке в UIWebView, а в результате проб и ошибок я обнаружил, что это происходит в 4-й раз, когда я показываю один и тот же видеопоток в вид. Если я попытаюсь открыть 4 видеопотока в браузере-вкладках, четвертый застрял в цикле загрузки, пока я не закрою один из предыдущих трех.

Это заставляет меня думать, что:

  • Камера, о которой идет речь, может одновременно обслуживать только три потока
  • Изменение атрибута src в теге <img...> не закрывает предыдущий поток

Можно ли связать это с keepalive? Могла ли система веб-браузера сохранить предыдущие потоки, даже если я прекратил показывать их в теге <img...>?

В принципе, для воспроизведения я могу это сделать:

  • Настройте содержимое выше в UIWebView
  • Назовите это 4 раза: wv.EvaluateJavascript("show(url)")

На четвертом вызове я получаю синий знак вопроса посередине.

Может ли быть живым виновником? И если да, могу ли я его контролировать?

Ответ 1

Это вызвано тем, что WebKit не останавливает загрузку ресурса изображения, даже если источник изменен. Обычно это не создает проблемы для изображений, но бесконечное потоковое изображение приведет к тому, что он никогда не будет отпущен, пока страница не будет перезагружена.

Существует ошибка, связанная с Chromium, которая указывает на эту проблему. https://code.google.com/p/chromium/issues/detail?id=73395

Из потока комментариев обходным путем является вызов window.stop() перед изменением изображения. Это то же самое, что нажать кнопку остановки в браузере и заставляет все загрузочные ресурсы прерываться. Надеюсь, что это не приведет к перезагрузке страницы, это позволит избежать вашей белой вспышки.

Я бы попробовал следующее:

<img id='iImage' src='about:blank'>
<script type='text/javascript'>
function show(url)
{
    window.stop();
    iImage.src = url;
}
</script>