0

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);
        }

但它太丑了不是吗?有没有人有好主意?

4

0 回答 0