Flash«这部电影中的剧本» - 由loadVars或setInterval引起?

时间:2010-10-24 20:56:40

标签: flash setinterval loadvars

这有些奇怪......

我有一个加载外部SWF的Flash文件。在那里,我使用LoadVars从服务器获取外部数据。当数据到达时,我正在使用setInterval来调用淡入内容的函数。

到目前为止一切顺利。

但是当我在所有数据到达之前切换菜单(也就是卸载一部电影以加载另一部电影)时,Flash会挂起15秒,然后向我显示臭名昭着的消息«这部电影中的剧本正在减慢Flash - 你会吗?喜欢中止吗?»(粗略翻译)。

我将一个«onUnload»函数附加到导致主要问题的SWF,我使用clearInterval去除间隔并重新实例化LoadVars-Variable。

没有任何帮助...

有什么想法吗?

根据要求 - 这是造成麻烦的SWF的来源:

var myTimer = null;
var server_send:LoadVars = new LoadVars();

this.onUnload = function () {
    clearInterval(myTimer);
    server_send = new LoadVars();
    trace("stopping gewerbe");
};

var myself = scrollContent;

import JSON;    // external Class for parsing JSON

var sRes:LoadVars = new LoadVars();

function fadeIn(which){
    which._alpha += 3;

    if(which._alpha >= 100){
        clearInterval(myTimer);
    }
}

sRes.onLoad = function(success:Boolean){

    if (success){

        var o:Object = JSON.parse(sRes.res);
        var s:String = JSON.stringify(o); 

        //trace(sRes.res);

        var y = 0;

        for(item in o){

            actCol = 0;

            myself.attachMovie("row", "entry" + item, myself.getNextHighestDepth(), {_x: 0, _y:y});

            var tr = myself["entry" + item];

            tr.cTitle = o[item]["title"];
            tr.cBild = o[item]["image"];
            tr.cText = o[item]["text"];
            y += 65;

        }

        myTimer = setInterval(fadeIn, 0.1, myself);

        _root.myIntervals.push(myTimer);

    }
    else
    {
        trace("no connection...");
    }

}

myself._alpha = 0;

var vars = Array("id");
var values = Array("3");

server_send.load('void.txt');

for(var i=0;i<vars.length;i++)
{
    server_send[vars[i]] = escape(values[i]);
}

server_send.sendAndLoad(_global.server, sRes, "POST");

stop();

2 个答案:

答案 0 :(得分:0)

更新

首先我建议你放弃使用setInterval,它们特别成问题。而是使用Timer类,它更易于管理和使用。

setInterval函数中的sRes.onLoad可能是你的问题。间隔应以毫秒为单位,因此您的0.1应该为100(1/10秒),而clearIntervalfadeIn中的unLoad次呼叫可能会myInterval范围,用trace检查这些,以确保它们按预期清除。

代码

好的,我已经重新订购了代码,使其更具可读性......但是,它仍然处于非常糟糕的状态。我正在标记我需要与您进一步讨论......(请参阅下面代码中的其他注释。)

stop();

// Moved import to the top.
import JSON;

// Grouping var declarations.
var myself = scrollContent;
myself._alpha = 0;

var values = Array("3");
var myTimer = null;
var sRes:LoadVars = new LoadVars();
var server_send:LoadVars = new LoadVars();
var vars = Array("id");    

// why are we looping through an array of one value?
for(var i=0; i<vars.length; i++)
{
    server_send[vars[i]] = escape(values[i]);
}

server_send.load('void.txt'); // what is this for?

server_send.sendAndLoad(_global.server, sRes, "POST"); // where do we define _global.server

this.onUnload = function () {
    clearInterval(myTimer); // is myTimer in scope here?
    server_send = new LoadVars();
    trace("stopping gewerbe");
};    

function fadeIn(which){
    which._alpha += 3;
    if(which._alpha >= 100){
        clearInterval(myTimer); // is myTimer in scope here?
    }
}

sRes.onLoad = function(success:Boolean)
{
    if (success)
    {
        var o:Object = JSON.parse(sRes.res);
        var s:String = JSON.stringify(o); 
        var y = 0;

        for(item in o)
        {
            actCol = 0;
            myself.attachMovie("row", "entry" + item, myself.getNextHighestDepth(), {_x: 0, _y:y});
            var tr = myself["entry" + item];
            tr.cTitle = o[item]["title"];
            tr.cBild = o[item]["image"];
            tr.cText = o[item]["text"];
            y += 65;
        }

        myTimer = setInterval(fadeIn, 0.1, myself); // setInterval uses milliseconds 0.1 is almost certainly the problem. 
                                                    // if you want 1/10th of a second, specify 100 as the interval.
        _root.myIntervals.push(myTimer); // We never see _root.myIntervals again, what's this for? 
                                         // The fadeIn and unLoad methods could use this to 
                                         // guarantee that they clear the right interval.
    }
    else
    {
        trace("no connection...");
    }
}

答案 1 :(得分:-1)

感谢您的帮助 - 似乎我找到了怪癖......

仍然调用sendAndLoad-response,即使电影被卸载,也会导致循环。

我做的是:

在名为«doParse»的脚本顶部添加了一个变量并将其设置为true

var doParse = true;

然后在unload-function中,我将此var设置为false:

this.onUnload = function () {
doParse = false;
...
}

如果在数据到达时被调用,我添加了这个:

if(success && doParse == true){
...
}

这有助于消息消失。