Flash Player 在 11.5+ 中支持线程。
我想在工作线程中使用 Loader.loadBytes() 加载图像。
Image ByteArray 在主线程中生成。
但我做不到。
我得到了这样的安全错误:
SecurityError:错误 #2123:安全沙箱违规:Loader.content:file:///E:/work/ASWorkSpace/test/bin-debug/test.swf 无法访问 file:///E:/work/ASWorkSpace/test /bin-debug/test.swf/[[动态]]/1。没有策略文件被授予访问权限。
我像这样初始化我的工作线程:
worker = WorkerDomain.current.createWorker(this.loaderInfo.bytes);
所以它不是来自远程的 swf,而是本地的或类似的
[Embed(source="../workerswfs/Thread.swf", mimeType="application/octet-stream")]
我在手册中找到。它说“如果加载的内容是图像,则安全沙箱之外的 SWF 文件无法访问其数据,除非该 SWF 文件的域包含在图像源域的 URL 策略文件中。”
我得到了解决方案。我 loadByte() 两次,似乎“洗掉”了 ByteArray 源。所以 FlashPlayer 考虑了 Worker Thread 生成的 ByteArray,它允许访问 loader.content。像这样:
//Messages to the Main thread
protected function onMainToWorker(event:Event):void {
var msg:ByteArray = mainToWorker.receive() as ByteArray;
trace(msg.length);
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, bytesComplete);
var bytes:ByteArray = new ByteArray();
bytes.writeBytes(msg,0,msg.length);
loader.loadBytes(bytes);
}
private function loadedAagin(e:Event):void
{
var loader:Loader = (e.target as LoaderInfo).loader;
// Here we can access it.
var bmp:Bitmap = loader.content as Bitmap;
}
private function bytesComplete(e:Event):void
{
var loader:Loader = (e.target as LoaderInfo).loader;
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, bytesComplete);
// var bmp:Bitmap = loader.content as Bitmap; It can not be accessed
// just loadBytes again, it seems "washed off" the ByteArray source
var newloader:Loader = new Loader();
newloader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadedAagin);
newloader.loadBytes(loader.contentLoaderInfo.bytes);
}
但它太丑了不是吗?有没有人有好主意?