Веб-разработка

индекс
236,88

Пишем RSS-читалку на Flex

Попробуем сделать при помощи Flex простое приложение. Впрочем, это не будет обычный Hello World, это будет нечто более полезное.
Но перед тем, как попробовать сделать что-нибудь с помощью Flex, разберемся, какие возможности появились в новой версии.
  • Теперь с помощью Flex можно разрабатывать AIR-приложения, которые запускаются локально и без запуска веб-броузера
  • Расширены возможности изменения скинов и стилей Flex, теперь они могут редактироваться с помощью встроенного в Flex Builder редактора
  • Появились новые компоненты, в том числе для работы с данными.
  • Средства для разработки теперь включают в себя профилировщики памяти и производительности
  • Теперь не нужно создавать несколько версий приложения для нескольких языков, поскольку локализация производится на лету
  • Улучшилась производительность, скорость работы приложений, понизились затраты памяти

Теперь наконец-то приступим к разработке чего-нибудь с помощью Flex. Для работы нам понадобится Flex SDK или Flex Builder. В принципе, можно настроить для работы с SDK любую другую среду разработки. Для Eclipse также существует плагин для разработки в Flex.
Наше приложение будет достаточно простой оболочкой для Twitter. Оно будет получать потоки сообщений от друзей с помощью RSS.
Наш пример будет основан на Flex Builder от Adobe, поэтому не все в тексте следует воспринимать буквально.

Создаем новый Flex-проект


Для начала, как обычно, создадим новый Flex Project (в меню File->New, разумеется). Укажите имя и расположение проекта, а другие настройки пока что не будем трогать. Жмем Finish.
Если вы посмотрите на структуру папок, то увидите вот такие:
  • bin — здесь хранится скомпилированная версия вашего приложения.
  • html-template — здесь лежит HTML-шаблон, в который будет помещено ваше приложение
  • libs — здесь будут библиотеки, созданные в процессе
  • src — здесь, как видим, находится исходный код приложения. В этой папке мы и будем работать.

Объявление приложения


В папке src вы найдете файл с именем вашего проекта и расширением MXML. Если переключиться в режим Source, то можно увидеть следующий код:
<? xml version=«1.0» encoding=«utf-8»?>
<mx: Application xmlns: mx=«www.adobe.com/2006/mxml»
layout=«absolute»>
</mx: Application>


Начнем создавать интерфейс нашего приложения. С панели компонентов перенесите в приложение Label и List.
Label будет служить обычным заголовком, выберите его и в панели Property Inspector впишите понравившиеся значения.
List будет заполняться постами из Twitter при загрузке приложения. Сделайте его побольше, и настройте его так, чтобы он стоял не на самом краю и растягивался вместе с приложением. Еще List`у надо назначить имя, пусть это будет, к примеру, «tweets». Это можно сделать, вписав id=«tweets» в тег компонента.
Назначение имени компоненту необходимо для того, чтобы в дальнейшем обращаться к нему из ActionScript-кода. Имя компонента должно быть уникальным.
Теперь ваш MXML-код должен выглядеть примерно так:
<? xml version=«1.0» encoding=«utf-8»?>
<mx: Application xmlns: mx=«www.adobe.com/2006/mxml»
layout=«absolute»>
<mx: Label x=«10» y=«10» text=«My Super Twitter Application!»
fontFamily=«Arial» fontWeight=«bold»
fontSize=«15»/>
<mx: List left=«10» right=«10» top=«41» bottom=«10» id=«tweets»>
</mx: List>
</mx: Application>


Подключение данных


Данные из Twitter удобно получать с помощью RSS-потока. Есть еще несколько способов общения с API Twitter, но сейчас пока выберем этот.
Чтобы добраться до данных из Flex, надо будет воспользоваться компонентом HTTPService. Он позволяет посылать HTTP-запросы и получать данные. Для его подключения добавим вот такой код:
<mx: HTTPService id=«twitterFeed»
url=«https://twitter.com/statuses/friends_timeline/25883.rss» />


Как видно из кода, этому компоненту мы также назначаем id. В параметре URL мы сообщаем ему, по какому адресу надо будет брать данные. Впрочем, перед тем, как вы сможете увидеть полученные данные в вашем приложении, необходимо будет сделать еще две вещи:
  • Попросить HTTPService получить данные из RSS-потока
  • Поместить полученные данные в List

Логично предположить, что данные вы хотите получить в момент загрузки приложения. Для этого надо сделать кое-какие изменения в объявлении приложения:
<mx: Application xmlns: mx=«www.adobe.com/2006/mxml»
layout=«absolute»
creationComplete=«twitterFeed.send()» >


Как видите, событию приложения creationComplete мы назначили выполнение функции send() компонента twitterFeed. Теперь нам надо обработать полученные данные и поместить их в List.
До появления ActionScript 3.0 обрабатывать XML было сущей мукой. Теперь эта задача решается с помощью мощного средства под названием E4X.
E4X позволяет обращаться к XML-документу более простым путем. Например, имея вот такой документ:
<? xml version=«1.0» encoding=«UTF-8»?>
<parent>
<child>
<property>value</property>
</child>
<child>
<property>value</property>
</child>
</parent>


… мы можем обратиться к свойству property вот так:
parent.child[0].property

Теперь, чтобы полученные данные были отображены в списке, нам понадобится сообщить списку об этом. Список как компонент может получать информацию из источника данных, который по сути является набором объектов. Чтобы указать источник данных для списка, нам понадобится вот такой код:
<mx: List left=«10» right=«10» top=«41» bottom=«10» id=«tweets»
dataProvider=«{twitterFeed.lastResult.rss.channel.item}» >
</mx: List>


Теперь при запуске приложения вы увидите, что список заполнился несколькими элементами, выглядящими как [object Object]. Это данные из нашего RSS-потока. Они представляют из себя сложные объекты, а компонент списка не знает, как их отобразить.
У каждого элемента в RSS-потоке есть несколько подэлементов — заголовок, описание, дата и ссылка. Это означает, что такой элемент не может быть отображен в списке без нашего вмешательства.
Одним из вариантов решения этой проблемы мог бы стать компонент DayaGrid, который отобразил бы эти элементы в отдельных колонках, но это не наш способ.
Мы подключим к списку обработчик отображения элементов. Он позволит указать, как отображать элементы в списке. Плюсом такого подхода является то, что, во-первых, обработчик будет сохранен как отдельный MXML-элемент, а во-вторых, что у нас будет намного больше возможностей управлять способом отображения элементов.
С помощью меню File->New создадим новый MXML-компонент. Назовем его Tweet, остальные настройки изменять не будем.
Перетащим в форму несколько текстовых полей и укажем, какие данные им предстоит отображать. Для этого в свойстве text первого поля укажем {data.pubDate} (фигурные скобки означают ссылку на данные), а в другом — {data.title}.
Теперь нам надо подключить обработчик к списку. Для этого поправим компонент List в главной форме:
<mx: List left=«10» right=«10» top=«41» bottom=«10» id=«tweets»
dataProvider=«{twitterFeed.lastResult.rss.channel.item}»
itemRenderer=«Tweet»>
</mx: List>


Теперь при запуске приложения вы увидите, что записи из RSS-ленты успешно загрузились и были отображены в вашем приложении. Элементарно, не правда ли?
Спасибо fzn7 за пример и исходники.
+28
24 сентября 2008, 00:17
41
kix

комментарии (27)

+3
m007 #
А где сама читалка?
Вот в противовес RSS читалка на JavaScript (фреймворк www.qooxdoo.org).
demo.qooxdoo.org/current/feedreader/
0
brabon #
выкладывай приложение в и-нет, хочется посмотреть.
Google Reader пока всем устраивает, только FF тормозит если ставлю userscripts и меняю стиль. Нужна альтернатива или как бекап :)
0
kix #
Неплохая читалка, надо будет посмотреть на нее поподробнее на досуге.
–3
Snut #
да… ни отлова ошибок, ни сохранения нескольких фидов… ничего… давно программим во флексе?
+3
sp2k6 #
А вы в Hello World`е всегда делаете отлов ошибок и сохранение настроек приложения?
–2
Snut #
это рсс читалка, испольуя которую юзер должен видеть почему у него, блять, не работает загрузка вбитого линка, из-за того что он криворукий или из-за того что сервер в дауне. Да и нет смысла делать читалку со встроенным адресом ИМХО бесполезно.
+1
sp2k6 #
Не забывайте, что это лишь пример реализации рсс-читалки, а никак не рабочий пример.
0
sp2k6 #
Не рабочий продукт, то есть.
–5
Snut #
а тогда цель статьи? Посмотрите мы быдлокодим во флексе?
+2
sp2k6 #
Товарищ, вы смогли за три коммента обгадить труд одного человека и заставить усомниться всех в вашей адекватности. Вон, ниже коммент fzn7, он верно написал для чего эта статья.
Если вы считаете себя профи во флексе — то лучше скажите что то полезное, имеющее отношение к цели статьи.
–2
Snut #
я считаю что флекс тормознутый фреймворк и всячески открещиваюсь от его использования.

Ну а если по сути:

<? xml version=«1.0» encoding=«utf-8»?>
<mx: Application xmlns: mx=«www.adobe.com/2006/mxml» layout=«absolute»>
<mx: Script>
<![CDATA[
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
[Bindable]
private var _feedUrl: String;
public function get feedUrl(): String {
return this._feedUrl;
}
public function set feedUrl(value: String): void {
if (this._feedUrl == value) return;
this._feedUrl = value;
}
private function handler_feedLoad(event: ResultEvent): void {
//TODO: творим с фидом что хотим так как он загрузился уже полностью.
}
private function handler_feedFault(event: FaultEvent): void {
Alert.show(event.toString(), 'ERROR');
}
private function handler_takeFeed(event: Event): void {
this._feedUrl = this.feedInput.text;
//ТУТ желательна проверка на www. .domain;
this.getFeeds.send();
}
]]>
</mx: Script>
<mx: HTTPService id=«getFeeds»
url=«{this._feedUrl}»
useProxy=«false»
resultFormat=«e4x»
result=«handler_feedLoad(event)»
fault=«handler_feedFault(event)»
showBusyCursor=«true» />
<mx: TextInput id=«feedInput» text=«https://twitter.com/statuses/friends_timeline/25883.rss» />
<mx: Button label=«take feed» click=«handler_takeFeed(event)» x=«329»/>
</mx: Application>
–2
Snut #
вот тут наглядно показанно как можно качественно использовать httpservice, критикуйте:)

А по поводу неадекватности… черт его знает, мож так и есть:)
0
sp2k6 #
Ну на первый взгляд — нормально написано, а уж если пошла такая пьянка, то проставлять абсолютную позицию у каких либо визуальных компонентов — это зло (я про это: <mx: Button label=«take feed» click=«handler_takeFeed(event)» x=«329»/>).
Я бы сделал вот так:
<mx: Button label=«take feed» click=«handler_takeFeed(event)»/>
0
sp2k6 #
Чьёрт побьерри, хабра парсер съел код…
Вот что я писал:
<mx: HBox width=«100%» horizontalAlign=«right»>
<mx: Button label=«take feed» click=«handler_takeFeed(event)»/>
<mx: /HBox>
0
kix #
</mx: HBox> будет правильнее все же.
0
sp2k6 #
Да, верно, прост я на глаз написал этот код.
–1
Snut #
ну это естественно:) конечно зло.
0
fzn7 #
Да кому нужна эта рсс читалка, если их уже тысяча с половинкой? Тут показан пример использования HTTPService, парсинг xml с помощью e4x, использование кастом айтем рендера и дата провайдера у стандартных флексовских компонентов. Все. По отдельности нормально, но как продукт это, конечно, смешно.
–2
Snut #
эххх… не переспорить мне вас… я всегда, как программист, смотрю на продукт в целом, а не по частям. и не соглашусь что HTTPService описан со всех _необходимых_ сторон.
0
fzn7 #
Да это вообще не статья, а какой-то левый перевод. Если б я не знал флекса, я бы по ней ничего не сделал. Взять хотя-бы:
С помощью меню File->New создадим новый MXML-компонент. Назовем его Tweet, остальные настройки изменять не будем.
Перетащим в форму несколько текстовых полей и укажем, какие данные им предстоит отображать. Для этого в свойстве text первого поля укажем {data.pubDate} (фигурные скобки означают ссылку на данные), а в другом — {data.title}.
Совершенно непонятно что это такое. Почему ничего не нужно изменять, если по умолчанию флекс предлагает компонент Canvas размером 400х300? Хреновый получается itemRenderer из этого. Само оформление статьи убивает. Откуда пробелы между нэймспейсами и названием тега? Елочки заместо стандартных кавычек? Автору должно быть стыдно.
0
Snut #
ну елочки — это типограф:)
0
fzn7 #
www.bankinform.ru/habraeditor/ Для этого создан.
0
Snut #
Да и еще надо понимать что программа программе рознь и по-хорошему ВСЕГДА НАДО ЛОВИТЬ ОШИБКИ! А еще лучше, если ошибка не вашего приложения — показывать их пользователю. Или здесь собрались люди которые только для себя пишут малюсенькие программы?
0
Unkn0wn #
Плючом такого подхода является то
Исправьте опечаточку :)

И также хотелось бы посмотреть на рабочую версию проги.
+1
fzn7 #
У меня это выглядит вот так www.picamatic.com/show/2008/09/24/12/36/1069662_497x566.PNG
А рабочую версию программы с исходниками можете слить с fzn7.ru/habr/FlexReader.zip
0
kix #
Спасибо за исправления и спасибо за рабочую версию с исходниками!
К сожалению, сам я про это забыл, да.
0
kix #
Добавил в статье ссылку на ваши исходники, надеюсь, вы не будете против.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.