如何从线程触发属性更改事件



我正在制作一个安卓应用程序,我想在类的属性maxDbRecorded Measure更改时更新标签。所以我在我的活动中实现了一个 PropertyChangeListener。

public class AndroidCalibrationTestActivity extends Activity implements PropertyChangeListener {
   private Recorder recorder;
   private Thread recorderThread;
   private Measure measures;
   private TextView numberOfMaxDecibels;
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       numberOfMaxDecibels = (TextView)findViewById(R.id.txtNumberOfMaxDecibels); 
       measures = new Measure();
       measures.addPropertyChangeListener(this);
       recorderThread = new Thread((Runnable) Recorder.getInstance().runRecorder); 
       recorderThread.start();
   }
   public void propertyChange(PropertyChangeEvent event) {
        numberOfMaxDecibels.setText(event.getNewValue() + "");  
   }          
}

现在我想从线程中设置 maxDbRecorded 的值。以便文本视图编号最大分贝更新。

public class Measure {
    private double maxDbRecorded;   
    private PropertyChangeSupport pcs = new PropertyChangeSupport(this);
    public Measure() {  
    }
    //Getters and setters       
    public double getMaxDbRecorded() {  
        return maxDbRecorded;
    }
    public void setMaxDbRecorded(double maxDbRecorded) {
            double oldValue = this.maxDbRecorded;
            this.maxDbRecorded = maxDbRecorded;
            //Fires a property change event
            pcs.firePropertyChange("maxDbRecorded", oldValue, maxDbRecorded);           
    }
    //To let classes subscribe for property changed listener
    public void addPropertyChangeListener(PropertyChangeListener listener){
        pcs.addPropertyChangeListener("maxDbRecorded", listener);
    }
}

在类记录器中,我的线程设置了maxDbRecorded,但 PropertyChanged 事件没有被触发。如果我直接从活动中设置maxDbRecorded,它确实有效。

public class Recorder {
    protected Measure m;
    private Recorder() {
        m = new Measure();
    }
    public static Recorder getInstance() {
        if(instance == null){
            instance = new Recorder();
        }
        return instance;
    }
    Runnable runRecorder = new Runnable() { 
        public void run() {
             startRecording();  
        }
    };
    public void startRecording() {
        //Here happens some recording stuff
        double maxDB;
        m.setMaxDbRecorded(maxDB);
    }     
}

我还尝试在我的活动中创建一个度量对象,并将此实例提供给记录器线程。这会产生错误: $CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触摸其视图。

你应该使用 android Handler 类通过它发布对 ui 线程的调用。

检查:http://www.vogella.com/articles/AndroidPerformance/article.html

最新更新