我有一个使用名为OpenPlug的第三方工具开发的iPad应用程序,它将AS3转换为C ++,并从那里导出到iOS。 (只是想注意这不是一个在我写的XCode中使用Obj-C的“原生”应用程序,我写的是AS3)
现在我有这个iPad应用程序,以幻灯片形式显示图片和视频。对于视频我正在使用一个WebView,它加载一个HTML页面,我将视频对象的src属性更改为下载到我的应用程序存储的视频文件的位置。这工作正常,但应用程序在运行几个小时(3-6)时会冻结。
我搜索了这个问题并尝试了iOS Safari memory leak when loading/unloading HTML5 <video>中的解决方案,但这对我来说似乎没有任何改变。
由于应用程序冻结(在HTML页面需要加载视频之前)并且没有崩溃,这意味着什么?我需要销毁视频对象吗?首先,我为每个视频创建了一个新的WebView,但现在我正在重用webview并只是更改src属性,但这对我没有帮助。
有人可以对此有所了解吗? OpenPlug已停止服务,不再提供任何支持,但我认为它更像是iPad上的webview / video问题(?)
重要提示:应用程序正在冻结但我的iPad却没有。应用程序不会生成崩溃报告,也不再执行任何代码(也没有跟踪)。当我按下iPad上的Home按钮并按下应用程序图标时,应用程序将重新启动。
以下是我的HTML页面的代码,每次需要启动新视频时都会刷新(webview.location = ...)
<html>
<head>
<script>
function videoEndedHandler(){
var video = document.getElementById("videoPlayer");
video.src = "";
video.load();
window.location.hash = "ended";
}
function videoErrorHandler(){
window.location.hash = "error";
var video = document.getElementById("videoPlayer");
video.src = "";
video.load();
}
var loop;
function setup(){
var video = document.getElementById("videoPlayer");
video.addEventListener("error", videoErrorHandler,false);
video.addEventListener("ended", videoEndedHandler,false);
video.load();
video.play();
startHashLoop();
}
function startHashLoop(){
if(window.location.hash == "#touched"){
setAsPaused();
}
if(window.location.hash == "#paused"){
//check image
testImage("shouldResume.png?nocache=" + Math.random());
}
if(window.location.hash == "#resume"){
var video = document.getElementById("videoPlayer");
video.play();
}
loop = setTimeout(hashLoop,500);
}
function testImage(url) {
var img = new Image;
img.addEventListener("load",isGood);
img.addEventListener("error",isBad);
img.src = url;
}
function isGood() {
window.location.hash = "resume";
}
function isBad() {
//alert("Image does not exist");
}
function hashLoop(){
startHashLoop();
}
function setAsTouched(){
window.location.hash = "touched";
}
function setAsPaused(){
var video = document.getElementById("videoPlayer");
video.pause();
window.location.hash = "paused";
}
</script>
</head>
<body onload="setup();" style="background-color:#000000;">
<a href="javascript:setAsTouched()" style="top:0;left:0;position:absolute;z-index:1;color:#FF0000;border:0px solid red;width:100%;height:100%;display:block;"></a>
<video id="videoPlayer" style="top:0;left:0;position:absolute;" width="100%" height="100%" preload="auto" src="##VIDEO_URL##" autoplay="autoplay" webkit-playsinline />
</body>
</html>
答案 0 :(得分:0)
如果您发布整个代码会很有帮助,但我认为这很慢,因为您在主线程中加载了一个来自Web的视频,这也是重绘UI的原因。通过在线程中加载大型视频,您的用户界面也会冻结。
我建议将执行视频加载的代码移动到一个单独的线程中(如果你在iOS5上,请使用块)。