Flex应用程序不显示有时从URL加载的图像

时间:2011-01-17 08:46:49

标签: flex actionscript-3 flex4 flash

我的Flex 4应用程序中有以下Actionscript代码,用于在Sprite上显示图像。在开发此功能时,在本地Flash播放器中完美运行:

private function initializePhoto():void {
    var photoLoader:Loader = new Loader();
    photoLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onPhotoReady);
    photoLoader.load(new URLRequest("http://image.mydomain.com/icon/mark.png"));
}

public function onPhotoReady(event:Event):void {
    var marker:Bitmap = new Bitmap();
    marker.x = -32;
    marker.y = -8;
    marker.smoothing = true;
    marker.bitmapData = event.target.content.bitmapData;
    marker.width = 64;
    marker.height = 64;
    addChild(marker);
}

因此我获取生成的.swf文件并在我的本地Web服务器中运行它。看起来不错。将其上传到舞台并且看起来不错。第二天上映时,图像没有出现!困惑,我看着萤火虫,它显示图像实际上正在下载...只是不可见。当我在本地网络服务器上查看应用程序时,我会在本地查看firebug,图像有时只会出现!但总是在下载图像。通过adobe flash播放器在开发模式下永远不会失败。

发生了什么事?我想我有点困惑......我的想法是:

  • 我之前没有的某种安全问题。可以解释为什么它总是适用于独立的Adobe Flash播放器,也许我之前看到的图像是因为它们被缓存了?
  • 竞争条件,可能吗?可以解释为什么adobe flash player可以工作,因为它是即时的..而本地和特别是临时服务器有一个小的滞后。也许在我第一次测试时它们碰巧特别快?

我的猜测是存在某种竞争条件,在将位图添加到Sprite之前,是否必须等待onPhotoReady方法被调用?

更新 :对于如此简单的操作(显示来自网址的图片)而言,这是非常令人沮丧的。因此,当失败时,发生的事情是Event.COMPLETE事件永远不会被触发。但是,ProgressEvent.PROGRESS总是被触发两次(首先是0 bytesLoaded然后是所有bytesLoaded)。不会抛出或触发任何错误。

有趣的是,当这确实有效时,我在Firebug中看到http://image.mydomain.com/crossdomain.xml被请求,而未请求则不起作用(即使ProgressEvent.PROGRESS回调显示所有字节)加载)。我会想象在 获取图像之前,crossdomain.xml会被称为

更新2 :只需将额外参数new LoaderContext(true)添加到photoLoader.load()来电即可解决。

2 个答案:

答案 0 :(得分:0)

您是否检查过这可能是跨域政策问题?如果问题不能始终如一地发生,那么它就不是安全问题。

答案 1 :(得分:0)

如果您不需要编辑位图数据,您可以尝试简单地拍摄和图像对象,并将网址作为源。 直到现在,这对我有用,一定没有。