【问题标题】:iOS app freezes, not crashing when loading video in webviewiOS应用程序冻结,在webview中加载视频时不会崩溃
【发布时间】:2012-06-14 01:20:42
【问题描述】:

我有一个使用名为 OpenPlug 的第三方工具开发的 iPad 应用程序,该工具将 AS3 转换为 C++,然后从那里导出到 iOS。 (只是想注意这不是我写的在 XCode 中使用 Obj-C 的“原生”应用程序,我写的是 AS3)

现在我有了这个以幻灯片形式显示图片和视频的 iPad 应用程序。对于视频,我使用的是加载 HTML 页面的 WebView,在该页面中,我将视频对象的 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>

【问题讨论】:

  • 总而言之,“我的应用程序冻结了。”显示代码或没有人可以帮助你。
  • 添加了HTML页面的代码
  • 我也想知道为什么应用程序冻结而不是崩溃?知道有什么区别吗?
  • 谁能帮帮我?我有更多信息:即使有足够的可用内存,视频也会冻结,所以这不是内存问题,但由于某种原因,我的应用程序运行大约 8 到 9 小时后视频会冻结。这个视频以前播放过,所以我不知道它是什么,有人吗?
  • 请显示您正在加载此网页的代码。

标签: ios html video safari


【解决方案1】:

如果您发布整个代码会很有帮助,但我认为它会冻结,因为您正在主线程中从网络加载视频,该主线程还负责重绘 UI。通过在线程中加载大型视频,您的 UI 也会冻结。

我建议将执行视频加载的代码移到单独的线程中(如果您使用的是 iOS5,请使用块)。

【讨论】:

  • 问题是我使用的是 OpenPlug,所以我无法显示任何相关的 iOS 代码,因为我使用的是使用 C 编译到 iOS 的中间代码。
猜你喜欢
  • 2020-04-19
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多