gpt4 book ai didi

java - 如何从线程触发 PropertyChange 事件?

转载 作者:行者123 更新时间:2023-11-30 11:45:24 26 4
gpt4 key购买 nike

我正在制作一个 android 应用程序,我想在 Measure 类的属性 maxDbRecorded 发生变化时更新标签。所以我在我的 Activity 中实现了一个 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 的值。以便 textview numberOfMaxDecibels 更新。

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

在 Recorder 类中,我有我的线程,我在其中设置了 maxDbRecorded,但是 PropertyChanged 事件没有被触发。如果我直接从 Activity 设置 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);
}
}

我还尝试在我的 Activity 中创建一个 Measure 对象,并将此实例提供给 Recorder 线程。这给出了一个错误:$CalledFromWrongThreadException:只有创建 View 层次结构的原始线程才能触及它的 View 。

最佳答案

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

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

关于java - 如何从线程触发 PropertyChange 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10340727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com