1

这有点奇怪……

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

到目前为止,一切都很好。

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

我在 SWF 中附加了一个 «onUnload» 函数,它会导致主要问题,我使用 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();
4

2 回答 2

0

更新

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

不过,函数setInterval内部可能是您的问题。sRes.onLoad间隔应该以毫秒为单位,所以你的 0.1 应该是 100(1/10 秒),并且调用clearInterval可能超出范围,用 a 检查这些以确保它们按预期清除。fadeInunLoadmyIntervaltrace

代码

好的,我重新排序了代码以使其更具可读性......但是,它的状态仍然很糟糕。我正在标记需要与您进一步讨论的内容...(请参阅下面的代码中的其他注释。)

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...");
    }
}
于 2010-10-24T21:02:21.587 回答
-1

感谢您的帮助-好像我发现了怪癖...

sendAndLoad-response 仍然被调用,即使在电影被卸载时,它似乎也导致了一个循环。

我所做的是:

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

var doParse = true;

然后在卸载函数中,我将此 var 设置为 false:

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

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

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

这有所帮助,消息消失了。

于 2010-10-24T21:46:00.737 回答