Индикатор прогресса во время события загрузки — возможно ли это?

Разработка интеллектуальных устройств в Genexus. Я использую событие загрузки для загрузки нескольких сотен записей (возвращенных сторонним веб-сервисом) в сетку (некоторые строки могут иметь разные макеты).

Когда пользователь нажимает кнопку поиска, сразу же отображается ProgressIndicator (во время выполнения процедуры). Когда процедура завершается (данные получены), ProgressIndicator исчезает, но может потребоваться еще 4-5 секунд, чтобы Grid отобразил свежие данные.

Это заставляет пользователя думать, что возникла проблема с поиском. Затем неожиданно сетка обновляется.

Можно ли как-то показать ProgressIndication во время событий загрузки или обновления? Или у вас есть какие-либо предложения, чтобы предотвратить это поведение?


person Jaime    schedule 20.01.2015    source источник


Ответы (1)


Основная проблема заключается в том, что события Refresh и Load являются «серверными» событиями в архитектуре SD, поэтому у вас нет доступа к API или ресурсам устройства, таким как индикатор выполнения.

У нас было такое же требование в iOS, и мы использовали событие GXRefresh.

Event 'gxrefresh'
   Composite
      //Your code. Example: ProgressIndicator.Hide()
   EndComposite
EndEvent

Gxrefresh — это локальное событие, которое выполняется после обновления и загрузки. Это скрытое событие, которое помогло нам в этом. (Это не официальное мероприятие и его можно вынести в любой версии GeneXus) Итак, решение такое:

  • Запустите индикатор прогресса в событии ClientStart этой панели.
  • Скройте индикатор выполнения в событии gxrefresh этой панели.

Примечание. Помните, что для использования события gxrefresh вам потребуется добавить скрытую кнопку с именем «gxrefresh». Вы можете скрыть эту кнопку, так как она вам не понадобится в пользовательском интерфейсе (мы установили Visible=false на панели приложений).

Если это решение по какой-либо причине невозможно (например, событие gxrefresh устарело или вы разрабатываете для Android), я могу придумать второй WA, который совсем не элегантен, но должен работать.

  • Запустите индикатор прогресса в событии запуска клиента на панели.
  • Поместите скрытую переменную с типом управления SD Chronometer.
  • Установите таймер на 6 секунд
  • Остановите индикатор выполнения на событии Tick хронометра SD и остановите хронометр, чтобы событие Tick больше не выполнялось.

Это два варианта, которые я могу придумать. Может быть, есть более простой способ, но я о нем не слышал. Для этого сценария отлично подойдет событие Grid.DidLoad. Наверняка у нас скоро будет это или какое-то другое решение этой проблемы.

Ссылки:

Хронометр SD: http://wiki.genexus.com/commwiki/servlet/hwikibypageid?25058< /а>

События SD: http://wiki.genexus.com/commwiki/servlet/hwikibypageid?17042< /а>

События на стороне сервера: http://wiki.genexus.com/commwiki/servlet/hwikibypageid?24234

person Franklin    schedule 21.01.2015
comment
Привет. Спасибо за ваш отзыв, он был очень поучительным. Итак, мой «поиск» события начинается с инструкции ProgressIndicator.ShowWithTitleAndDescription('MyApp','Please wait...'), затем вызывается процедура. Однако кажется, что ProgressIndicator автоматически скрывается в строке endEvent, даже если я опускаю инструкцию ProgressIndicator.Hide(). Поэтому при следующем SDEvent (gxrefresh или chronometer.tick) индикатор прогресса уже скрыт. Есть ли что-нибудь еще, что я мог бы попробовать? - person Jaime; 21.01.2015
comment
Это правда, индикатор прогресса автоматически скрывается после конечного события. Выполняете ли вы обновление в своем поисковом событии? - person Franklin; 21.01.2015
comment
Да, сразу после события поиска (для обновления данных в сетке). - person Jaime; 22.01.2015