我有一个非常复杂的Flash应用程序(想想Flash中的Photoshop )。
有很多图像处理,除了一个错误之外,所有的操作都很好。
应用程序具有撤消/重做功能,有时会引发错误。这里有太多的代码无法粘贴,但问题主要围绕在这一行代码上:
trace("UNDO BMD: " + BeautyGlobal.undoArray[_undoSteps].bitmapData);
var newUndoData:BitmapData = BeautyGlobal.undoArray[_undoSteps].bitmapData.clone()跟踪语句显示:
UNDO BMD: [object BitmapData]
ArgumentError: Error #2015: Invalid BitmapData.
at flash.display::BitmapData/clone()
at Main/undoAction()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at com.beautyCanvas.ui::Toolbar/undoClick()所以那里有位映射数据,但是它是无效的。这个问题本身并不总是预设的。如果我能够检测到位图数据是否有效,我可以阻止它破坏整个应用程序。我试过几件事:
如有任何建议,将不胜感激。
谢谢!
发布于 2011-02-03 16:14:20
这很可能是因为您的应用程序使用了过多的内存,并且达到了极限。检查Flash播放器的内存使用情况。
捕获和处理此错误的一种方法是简单地使用try..catch块:
try {
var newBitmapData:BitmapData = oldBitmapData.clone();
} catch (e:Error) {
if (e.errorID == 2015) {
// handle it
} else {
throw e;
}
}如果您一直遇到此错误,并且能够确认内存使用量的增加确实存在相关性,那么您首先要做的一件事是确保正确地处理任何丢弃的BitmapData对象:
// dispose first
myBitmapData.dispose();
myBitmapData = null;在丢失对BitmapData实例的所有引用之前,首先要对其进行dispose()。
发布于 2011-02-03 14:56:09
用try {} catch (e:Error){}包装你的克隆代码似乎可以阻止你的应用程序崩溃。
我猜问题的原因是内存不足。为每个撤销步骤保留一个画布的完整克隆非常昂贵。Invalid BitmapData最常见的原因是试图在两个方向上创建大于2880 me的位图(fp9,fp10要高一点),但是如果这也发生在内存相关的问题上,我也不会感到惊讶。
发布于 2011-02-03 15:18:10
你试过draw()或copyPixels()而不是clone()吗?无论如何,关于try块,葡萄柚是正确的。
https://stackoverflow.com/questions/4887523
复制相似问题