2014-11-19 4 views
1

У меня около 50 переменных, которые обновляются со скоростью около 1 кГц по сети, но их значения меняются только каждые несколько секунд.Обновление пользовательского интерфейса при изменении переменной

Значения для пользовательского интерфейса (например, текст, видимость и цвет фона для кнопок).

Каков наиболее эффективный способ обновления пользовательского интерфейса?

Я ранее выполнял задание каждые 100 мс в потоке пользовательского интерфейса, которое задавало все переменные пользовательского интерфейса. Проблема для меня была дрожанием других задач каждые 100 мс.

Я ищу решение для обновления пользовательского интерфейса только при изменении переменных.

Есть ли другой способ, чем реализовать собственный «измененный переменный» слушатель?

ответ

0

Я считаю, что внедрение «измененного переменным» слушателя, вероятно, является наиболее правильным (и наиболее эффективным) способом реализации этого, но вы всегда можете сравнить значение, отображаемое в настоящее время в пользовательском интерфейсе, до значения, обновленного в сети до изменение пользовательского интерфейса.

if(!label.getText().equals(networkVal)) { 
    label.setText(networkVal); 
} 

Я думаю, что что-то подобное будет работать с системой, которую вы описали, и уменьшить дрожание.

+0

thx Я попытаюсь запустить только .setText() в пользовательском интерфейсе. Я сохраняю .getText(). Equals() в нормальном потоке. Считаете ли вы, что идея в порядке? кстати: пользовательский интерфейс не должен быть быстрым –

+0

Каков барьер для всего этого в потоке пользовательского интерфейса? Выполнение проверки в другом потоке, кроме набора, приведет к условиям гонки. http://en.wikipedia.org/wiki/Race_condition – Samuel

2

Это распространенная проблема в информатике и уже решена Бандой Четырех. Используйте шаблон Observer/Observable для распознавания изменений. Android также имеет встроенные модули, которые реализуют MVC (адаптеры и списки ListView ...).

+0

Мне определенно нужно изучить его. Я не слышал об Observable :) –

0

Возможно, вы захотите рассмотреть возможность использования методов setter для ваших переменных и обновления ваших виджетов внутри этих методов.

0

Я ранее выполнял задание каждые 100 мс в потоке пользовательского интерфейса, которое задавало все переменные пользовательского интерфейса. Проблема для меня была дрожанием других задач каждые 100 мс.

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

С другой ответ:

вы всегда можете сравнить значение в данный момент отображается в пользовательском интерфейсе до значения обновленной сети до изменения пользовательского интерфейса.

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

Я сохраняю .getText(). Equals() в нормальном потоке. Это будет работать, если только этот поток был единственным, обновляющим значение. Что не так, как вы должны делать все обновления в AWT Thread. Это может привести к проблемам.

Самое простое решение:

  • Поддерживать копию переменных.
  • Время от времени сравнивайте несколько переменных с копией (так что всего каждые 100 мс все переменные проверяются).
  • При возникновении каких-либо различий обновите графический интерфейс (с использованием SwingUtilities.invokeLater) и обновите копию (обычно).

The Observer Pattern - это лучшее, но гораздо более подробное решение.

Смежные вопросы