这有些奇怪......
我有一个加载外部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();
答案 0 :(得分:0)
首先我建议你放弃使用setInterval,它们特别成问题。而是使用Timer
类,它更易于管理和使用。
setInterval
函数中的sRes.onLoad
可能是你的问题。间隔应以毫秒为单位,因此您的0.1应该为100(1/10秒),而clearInterval
和fadeIn
中的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){
...
}
这有助于消息消失。