在我的项目中,我让用户使用FileReference类来选择图片。然后,我使用load()函数将这些图片加载到它们的.data属性中。在此之后,我将执行一些本地操作,并将其发送到服务器。
我想做的是能够再次遍历选择的FileReferences,将它们加载到.data属性中,执行不同的操作,然后再次将它们发送到服务器。我知道我应该能够从用户调用的事件中做到这一点,这在这里不是问题。
问题是,一旦第一次加载FileReference,就无法以任何方式卸载它,并且由于这些图片很大,因此无法将所有图片的数据保留在内存中。
所以我想我只能做一件事,就是对FileReference执行DeepCopy ...然后我可以加载第一个版本,将其报废,然后将副本用于第二个“运行”。
我试图使用ObjectUtil.copy,但是当我访问例如副本的.name属性,它失败并显示:
Error #2037: Functions called in incorrect sequence, or earlier call was unsuccessful.
在flash.net::FileReference/get name()
相关代码段:
registerClassAlias("FileReference",FileReference);
masterFileList.addItem(FileReference(ObjectUtil.copy(fr_load.fileList[i])));
trace(masterFileList[i].name)
是否确实有FileReference类的某些 protected 属性可以防止其被复制?如果是这样,我可以以某种方式回避吗?还是对我的整体问题有其他解决方案?
我感谢任何提示/想法!
最佳答案
我几乎想完全按照您的方式去做,在阅读了一些答案后几乎放弃了,但是我想我找到了一种方法。我发现,如果您有一个FileReference对象,并多次调用load()
,它将起作用,但是主要的问题是,第一次加载后,您将高分辨率字节保留在内存中。正如您所提到的,对于不了解图像处理的人来说,这是一个很大的禁忌。
解决此问题的方法是,在第一个load()
之后,您需要在FileReference上调用cancel()
方法。从到目前为止的测试来看,这似乎将清除FileReference中的字节,并且如果第二次调用它,load()
仍然可以工作。请注意,这不是API中的明确定义的行为,因此它肯定会发生变化,但是这可能会帮助您同时达到所需的目标。
希望能有所帮助。