Как реализовать слушатель изменения переменных для переменной, запущенной в другом потоке (пример)

1

У меня есть переменная AtomicInteger (CurrentCycle), которая обновляется в отдельном потоке для моего потока пользовательского интерфейса. Я пытаюсь обновить текстовое поле в поле пользовательского интерфейса на основе значения AtomicInteger без цикла ugle while в потоке пользовательского интерфейса.

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

Мои основные вопросы: 1. Нужно ли мне регистрировать слушателя, чтобы сделать это, или есть более простой способ? 2. Где и как регистрировать слушателя? Должен ли я настраивать отдельный класс интерфейса (я бы хотел избежать этого, если это возможно). 3. Не могли бы вы привести некоторые реальные примеры, которые я мог бы использовать - абстрактные объяснения мне пока не помогают!

Я включил свой ключевой код (который ничего не делает, поскольку метод еще не уволен). Anyhelp, который вы можете предоставить, будет очень признателен.


// MyActivity.java
    // Declaration (do I need this?)
        AtomicInteger CurrentCycle = new AtomicInteger(0);'


// Method which doesn't appear to be firing when CurrentCycle Changes...
    public void setVariableChangeListener(VariableChangeListener variableChangeListener) {
         this.variableChangeListener = variableChangeListener;

        if ((CurrentCycle != PreviousCycle ) && (this.variableChangeListener !=null)) {
            Toast.makeText(getApplicationContext(), "Test - code on variable change is firing.", Toast.LENGTH_SHORT).show();
           PreviousCycle=CurrentCycle;
    }
Теги:
multithreading
variables
listener

1 ответ

1
Лучший ответ

Сам я просто дал классу поле PropertyChangeSupport, предоставил ему addPropertyChangeListener(...) и removePropertyChangeListener(...), только разрешить изменение атомной переменной в setXxx(...) и в том же методе, запустите событие изменения свойства. Я бы позаботился о том, чтобы событие пожара вызывалось в потоке событий GUI. Обратите внимание: если ваш графический интерфейс является графическим интерфейсом Swing, тогда, если вы используете SwingPropertyChangeSupport, проблема с потоками заботится о вас.

Например, от моего ответа на подобный вопрос здесь:

public class ServerManager implements Runnable {
  public static final String IS_RUNNING = "is running"; // for the Event name

  // if not a Swing app, then use a PropertyChangeSupport field
  private SwingPropertyChangeSupport propChngSupport = new SwingPropertyChangeSupport(this);
  private volatile boolean isRunning  = false;
  // other variables

  // addPropertyChangeListener(...) {...} goes here
  // removePropertyChangeListener(...)  {...} goes here

  public void setIsRunning(boolean isRunning) {
    boolean newValue = isRunning;
    boolean oldValue = this.isRunning;
    this.isRunning = isRunning;
    propChngSupport.firePropertyChange(IS_RUNNING, oldValue, newValue);    
  }

  public void run() {
    // ....
  }

  // other methods
}

Что касается ваших конкретных вопросов:

  • Нужно ли мне регистрировать слушателя, чтобы сделать это, или есть более простой способ?

Я не вижу ничего сложного в регистрации слушателей.

  • Где и как регистрировать слушателя?

Наблюдатель регистрируется на наблюдаемом вызове метода типа addListenerXxx(...).

  • Должен ли я настраивать отдельный класс интерфейса (я бы хотел избежать этого, если это возможно).

Нет, если вы используете сочетание PropertyChangeListener или Java Observer/Observable с классом/интерфейсом

  • Не могли бы вы привести некоторые реальные примеры, которые я мог бы использовать - абстрактные объяснения мне пока не помогают!

Вам нужно задать более конкретные вопросы, чем этот.

  • 0
    Спасибо за ответ на этот вопрос. Что если бы я хотел иметь больше гибкости в отношении того, что вызвано изменением переменной? Т.е. я хочу иметь возможность вызывать метод в потоке графического интерфейса?
  • 0
    @OmahaNebrasca: если у вас нет приложения Swing, просто используйте экземпляр PropertyChangeSupport, а не SwingPropertyChangeSupport, и этот код должен работать, если вы осторожны с потоками.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню