我正在製作一個簡單的工具,讓用戶最終將圖像保存到磁盤。 爲了做到這一點,我使用FileStream
類和它的writeBytes()
方法。如何在Flex中顯示FileStream的保存進度?
這工作很好。當我試圖用簡單的mx:ProgressBar
來顯示保存進度時,問題就發生了。我嘗試了一些方法,但似乎沒有任何工作。
這裏是ActionScript代碼片段:
private function save(file:File, image:MyImageClass):void {
var data:BitmapData = new BitmapData(width, height, true, 0x000000);
image.draw(data, _cols);
var bytes:ByteArray = new PNGEncoder().encode(data);
fileStream = new FileStream();
fileStream.addEventListener(OutputProgressEvent.OUTPUT_PROGRESS, onProgress);
fileStream.addEventListener(Event.CLOSE, onClose);
try {
fileStream.openAsync(file, FileMode.WRITE);
fileStream.writeBytes(bytes);
} catch (e:Error) {
Alert.show("Error trying to save the image: " + e.message);
} finally {
fileStream.close();
}
}
private function onProgress(event:OutputProgressEvent):void {
var progressRatio:Number = (1 - (event.bytesPending/event.bytesTotal));
progressBar.setProgress(progressRatio, 1);
trace(progressRatio);
if (event.bytesPending == 0)
event.target.close();
}
private function onClose(event:Event):void {
trace("closed");
}
和進度條的MXML:
<mx:ProgressBar id="progressBar" mode="manual"/>
執行此我有一個冷凍接口時,該文件被完全保存被釋放並在控制檯上同時獲取所有的痕跡。進度條保持在0%,直到界面被解凍並達到100%。
我知道Flash是單線程的,但我認爲FileStream.openAsync()
方法應該做骯髒的工作,使我的接口負責。做這個簡單和(我認爲)通用的任務不應該很難。
問題是:我做錯了什麼?
在此先感謝
只是一個更正; Flash Player不是單線程的。雖然他們不給程序員控制自己線程的能力。 「工作人員」功能將在即將發佈的版本中爲程序員提供「線程化」功能。但是,僅僅因爲我們無法產生我們自己的線程(但)並不意味着該程序是單線程的。 – JeffryHouser
@Reboog711 Actionscipt工作人員實際上早已被釋放。 – Gio
@Gio我應該在發帖之前查看它。我不確定他們是否「最近」,或者我們是否仍在等待。他們去年十月被加入Flash Player 11.4。 – JeffryHouser