我使用FlashPro和FlashBuilder。我在AIR中有一个应用程序,它从FlashPro中创建的SWF中读取资源。
问题是,如果我在FlashPro中更改某些内容并重新加载swf'a,则没有任何改变。我得到相同的符号,函数返回相同的数据。
如果我再次运行应用程序并加载swf,那么我可以看到更改。
似乎如果AVM2(FlashPlayer)加载一个类,它确信这个类不会改变它的内容。
我使用类Loader来加载swf。
有谁知道如何重新加载swf
我的功能:
protected function loadResourceFile() :void
{
if (_resourcesFile != null) {
_resourcesFile.unload();
_resourcesFile = null;
}
var ba :ByteArray = new ByteArray();
var fs :FileStream = new FileStream();
var srcFile : File = File.applicationDirectory.resolvePath(edResourcesSWF.text);
try {
fs.open(srcFile, FileMode.READ); // Otwarcie synchroniczne, można też asynchronicznie - openAsync()
fs.readBytes(ba);
fs.close();
} catch (e :Error) {
Alert.show('Błąd odczytu z pliku: ' + srcFile.nativePath + '\n\n' + e.message, 'Błąd');
return;
}
_resourcesFile = new Loader();
_resourcesFile.contentLoaderInfo.addEventListener(Event.COMPLETE, loadResourceFile_loaded);
_resourcesFile.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, loadResourceFile_ioErrorHandler);
try {
var context :LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
context.allowCodeImport = true;
context.allowLoadBytesCodeExecution = true;
_resourcesFile.loadBytes(ba, context); // <--- Load SWF
}
catch (e :Error) {
Alert.show('Nie można wczytać pliku zasobów: "' + edResourcesSWF.text + '"\n\n' + e.message, 'Błąd');
}
}
答案 0 :(得分:0)
这里有一些事情......首先是当你从不同的swfs加载相同的类时(实质上就是你正在做的事情),Flash假定它得到的第一个定义是正确的一。你可以用loader contexts之类的东西解决这个问题,但是我怀疑你的加载swf是直接触及加载的类,所以这可能不适合你。我看到你选择在主要环境中加载所有东西,所以在你改变它之前它绝对不适合你。
而不是直接触及类,而是编程到接口(抽象或基类也可以),并为主swf提供API,以从加载的swf请求本地实现接口。这将允许您在Application上下文中隔离不同的Class实现。
第二个问题可能是浏览器正在缓存swf。您可以通过在url:loader.load('http //:www.yourDomain.com/swfs/yourfile.swf?nocache='+ getTimer())附加参数来解决这个问题;