0

我使用 FlashPro 和 FlashBuilder。我在 AIR 中有一个应用程序,它从 FlashPro 中创建的 SWF 中读取资源。

问题是,如果我在 FlashPro 中更改某些内容并重新加载 swf'a,则什么都没有改变。我得到相同的符号,函数返回相同的数据。

如果我再次运行应用程序并仅加载 swf,那么我可以看到更改。

似乎如果 AVM2 (FlashPlayer) 加载一个类,它确信这个类不会改变它的内容。

我使用类加载器来加载 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');
    }
}
4

1 回答 1

0

这里发生了几件事……第一件事是,当您从不同的 swfs 加载相同的类(本质上就是您正在做的事情)时,Flash 假定它得到的第一个定义是正确的。您可以使用诸如loader contexts之类的方法来解决此问题,但我怀疑您的加载 swf 直接接触了加载的类,因此这可能对您不起作用。我看到您选择在主要上下文中加载所有内容,因此在您更改之前它绝对不会为您工作。

不是直接接触类,而是对接口进行编程(抽象类或基类也可以),并为您的主 swf 提供一个 API,以从加载的 swf 请求接口的本地实现。这将允许您在应用程序上下文中隔离不同的类实现。

第二个问题可能是浏览器正在缓存 swf。您可以通过将参数附加到 url 来解决此问题: loader.load('http//:www.yourDomain.com/swfs/yourfile.swf?nocache=' + getTimer());

于 2013-08-22T14:51:09.270 回答