Как управлять кэшированием контроля изображений Flex 3
Согласно документам Adobe Flex: http://livedocs.adobe.com/flex/3/html/help.html?content=controls_15.html
Использование изображения несколько раз
Вы можете использовать одно и то же изображение несколько раз в своем приложении, используя каждый раз обычный синтаксис импорта изображений. Flex загружает изображение только один раз, а затем ссылается на загруженное изображение столько раз, сколько необходимо.
Однако в ходе тестирования мы обнаружили, что если вы запрашиваете одно и то же изображение (тот же URL-адрес и т. Д.) В IE flash 9/10, новый http-запрос не будет выдан, но в Firefox, Safari (ПК и MAC) новый запрос будет всегда выдается.
Я хочу, чтобы изображение не вытаскивалось с сервера каждый раз, когда я пытаюсь его использовать. У кого-нибудь есть идеи, почему это работает только в IE?
6 ответов
Одним из обходных путей является создание собственного кэша изображений с помощью ActionScript путем сохранения BitMapData исходного экземпляра и использования его в качестве источника для последующих экземпляров:
private var image1:Image = new Image();
private var image2:Image = new Image();
private function init() : void
{
image1.addEventListener(Event.COMPLETE, onComplete);
image1.source = "icon.png";
addChild(image1);
}
private function onComplete(event:Event) : void
{
var image:Image = event.target as Image;
var bitmapData:BitmapData = new BitmapData(image.content.width,
image.content.height, true);
bitmapData.draw(image.content);
image2.source = new Bitmap(bitmapData);
addChild(image2);
}
Я создал полностью работающий пример и разместил источник здесь.
Вот ответ: НИКОГДА не думайте, что IE делает это правильно. IE был не прав, все остальные браузеры были верны. Файлы.swf возвращались с Cache-control: частный заголовок. IE не должен был возвращать кэшированное изображение. Правильная установка заголовка Cache-Control привела к тому, что все браузеры работают должным образом.
Лучший способ загрузить изображение один раз и затем многократно использовать его в приложении Flex - это встроить изображение и связать его с представлением класса, а затем просто ссылаться на этот класс.
Пример:
[Embed(source="myImage.jpg")]
[Bindable]
public var myImageClass:Class;
НТН
Я также успешно загрузил Image, а затем повторно использовал его свойство source:
<mx:Image id="myImage" source='blah.png'/>
var myNewImage:Image = new Image();
myNewImage.source = myImage.source;
На самом деле вопрос не в том, как кэшировать изображение, а в том, почему IE использует изображение в кэше браузера, а FF, Safari, Chrome и т. Д. Не используют? (IE7 кстати).
Я все еще пытаюсь придумать пример приложения разумного размера. У нас есть холст с mx:Image или mx:SWFloader. Холст воссоздается, однако URL-адрес изображения идентичен, поэтому браузер должен возвращать кэшированное изображение и не выдавать другой запрос на него. Очень простой пример просто mx:Image, где вы устанавливаете источник, очищаете источник и сбрасываете источник, правильно использует кэшированное изображение во всех браузерах.
Проблема заключается в сроке действия ваших изображений. Настройте на сервере приложений политику истечения срока действия изображений, и кэш работает нормально во всех браузерах.