如何为在不同线程中运行的变量实现变量监听器(示例)

时间:2014-09-01 17:05:34

标签: java multithreading variables listener

我有一个AtomicInteger变量(CurrentCycle),它在一个单独的线程中更新到我的UI线程。我试图在UI线程中根据AtomicInteger的值更新UI字段中的文本字段,而不在UI线程中使用ugle while循环。

我花了几天时间在网上搜索相关查询,但我没有得到任何关于此的信息。我正在寻找最简单的方法来做到这一点。我知道有类似问题的帖子,但我无法使用它们,因为它们太抽象或不同的需求。

我的主要问题是: 1.我是否需要注册一个听众来做这个或者有更简单的方法吗? 2.我在哪里以及如何注册听众?我是否必须设置一个单独的接口类(如果可能,我想避免这种情况)。 你能不能取一些我可以使用的真实例子 - 到目前为止,抽象的解释对我没有帮助!

我已经包含了我的密钥代码(因为该方法尚未被解雇,所以没有做任何事情)。你能提供的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;
    }

1 个答案:

答案 0 :(得分:1)

我自己,我只是给我的类一个PropertyChangeSupport字段,给它一个addPropertyChangeListener(...)removePropertyChangeListener(...)方法,只允许在setXxx(...)方法中更改原子变量,并以相同的方法,触发属性更改事件。我会注意在GUI的事件线程上调用fire事件。请注意,如果您的GUI是Swing GUI,那么如果您使用SwingPropertyChangeSupport,则会为您处理线程问题。

例如,根据我对类似问题的回答here

public class ServerManager implements Runnable {
  public static final String IS_RUNNING = "is running"; // for the Event's 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类/接口组合,则不会

  
      
  • 请问一些我可以使用的真实例子 - 到目前为止,抽象的解释并没有帮助我!
  •   

您需要提出比这更具体的问题。