Как я могу асинхронно опрашивать файл, используя флэш-таймер, не блокируя пользовательский интерфейс? - PullRequest
0 голосов
/ 26 июня 2009

У меня есть гибкое приложение, которое периодически опрашивает удаленный XML-файл, чтобы обнаружить изменения, но я обнаружил, что как только файл достигает определенного размера, опрос блокирует пользовательский интерфейс и делает страницу не отвечающей на короткое время.

Есть ли способ убедиться, что вызов, сделанный серверу или событие из класса flash.utils.Timer, выполняется асинхронно с основным потоком пользовательского интерфейса?

Ответы [ 3 ]

3 голосов
/ 26 июня 2009

Похоже, что блокировка вызвана синтаксическим анализом XML, а не фактической загрузкой.

Если это так, то вы можете продолжать загружать файл и просто проверять размер необработанных данных, которые вы возвращаете - если они больше, анализируйте их и выполняйте анализ. В противном случае сбросьте данные и дождитесь следующего запроса.

В настоящее время нет явного способа создания потоков с помощью Flash. Некоторые задачи выполняются асинхронно естественным образом (на ум приходит сеть и пиксельбендер), но это все.

1 голос
/ 28 июня 2009

Как уже упоминалось, AS3 является однопоточным. Но есть несколько способов справиться с вашей ситуацией. Вот ваш возможный выбор:

Во-первых, убедитесь, что вам действительно нужно проанализировать весь XML при загрузке и не можете просто сохранить загруженные узлы XML в памяти в качестве модели данных (XML сейчас является родным типом данных). Иногда я создаю объекты-значения, передавая им XMLNode, который сохраняется в памяти до тех пор, пока не понадобится значение узла, и в этот момент я его читаю. Это позволяет вам сохранить часть анализа на потом.

Если вы используете ArrayCollection или аналогичную структуру для хранения данных, попробуйте использовать примитивный массив (см. http://www.arpitonline.com/blog/?p=114 для проблемы, с которой я столкнулся)

Посмотрите, можете ли вы творчески использовать callLater () (http://livedocs.adobe.com/flex/2/langref/mx/core/UIComponent.html#callLater())

Можете ли вы передать данные клиенту в собственном формате, таком как SWX или с помощью удаленного взаимодействия

Можете ли вы использовать подкачку данных? ArrayCollections, и я уверен, что XMLCollection его поддерживает

Примечание стороны:

Хотя AS3 является однопоточным, Pixel Bender и я думаю, что Alchemy (http://labs.adobe.com/technologies/alchemy/) работают в другом потоке. Была проведена пара экспериментов над блогами с использованием Pixel Bender для выполнения вычислений, которые не замедляют работу пользовательского интерфейса). приложение (пример: http://elromdesign.com/blog/2009/02/09/using-pixel-bender-to-do-heavy-lifting-calculations-makes-flash-player-multi-thread/).

Также, пожалуйста, проголосуйте за этот билет для расширения возможностей с Adobe, если вы чувствуете потребность в этой функции достаточно: https://bugs.adobe.com/jira/browse/ASC-3222

1 голос
/ 27 июня 2009

Бранден прав - код, который мы пишем, по существу всегда происходит в основном потоке; в то время как сам сетевой вызов происходит в фоновом потоке, обработка этого вызова происходит в основном.

Следует иметь в виду, что классы WebService и HTTPService, скорее всего, попытаются автоматически сериализовать ваши ответы, что может означать, что обработка неоправданно пострадает. Использование URLLoader, с другой стороны, может предоставить вам более прямой доступ к данным ответов, что позволит вам работать более напрямую с ними без лишних затрат на эту встроенную обработку.

В этом свете, если вы обнаружите, что вам действительно нужно обработать весь XML-файл, вы можете как-то разбить его на куски и распределить обработку этих кусков по отдельным функциям, а не обрабатывать все в пределах области действия. единственная функция. Простое выполнение этого может позволить игроку продолжать обновлять пользовательский интерфейс, пока вы обрабатываете этот большой пакет текста (немного обрабатывать, выходить из функции, отображать пользовательский интерфейс, вводить следующую функцию, отображать и т. Д.); Оливер Голдман, инженер команды AIR, выступил с докладом по этой концепции на прошлогодней конференции MAX .

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...