如何在正在运行的应用程序中重新加载swf(重载类定义)?

时间:2013-08-22 09:19:29

标签: actionscript-3 flex flash

我使用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');
    }
}

1 个答案:

答案 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())附加参数来解决这个问题;