У меня есть переменная 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;
}
Сам я просто дал классу поле 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 с классом/интерфейсом
- Не могли бы вы привести некоторые реальные примеры, которые я мог бы использовать - абстрактные объяснения мне пока не помогают!
Вам нужно задать более конкретные вопросы, чем этот.