【问题标题】:How to implement an Variable Change Listener, for a variable running in different thread (example)如何为在不同线程中运行的变量实现变量更改侦听器(示例)
【发布时间】:2014-09-01 17:05:33
【问题描述】:

我有一个 AtomicInteger 变量 (CurrentCycle),它正在一个单独的线程中更新到我的 UI 线程。我正在尝试根据 AtomicInteger 的值更新 UI 字段中的文本字段,而在 UI 线程中没有丑陋的 while 循环。

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

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

我在下面包含了我的关键代码(它没有做任何事情,因为该方法还没有被触发)。您能提供的任何帮助将不胜感激。


// 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;
    }

【问题讨论】:

    标签: java multithreading variables listener


    【解决方案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 类/接口组合,则不会

    • 能否请您提供一些我可以使用的真实示例 - 到目前为止,抽象的解释对我没有帮助!

    你需要问比这个更具体的问题。

    【讨论】:

    • 感谢您回答这个问题。如果我想对变量更改触发的内容有更多的灵活性怎么办? IE。我希望能够在 GUI 线程中调用方法?
    • @OmahaNebrasca:如果您的应用程序不是 Swing 应用程序,那么只需使用 PropertyChangeSupport 实例而不是 SwingPropertyChangeSupport,如果您小心处理线程,这段代码应该可以工作。
    • 基本上 - 在一个可运行的线程中,我有一个循环通过定时循环播放不同的声音 - 我希望能够在播放的声音发生变化时显示一个图形,也许是一个计时器和一些文本。
    猜你喜欢
    • 1970-01-01
    • 2013-03-04
    • 2017-11-22
    • 2013-12-17
    • 2014-10-07
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多