私は、Measure
クラスのプロパティmaxDbRecorded
が変更されたときにラベルを更新するAndroidアプリケーションを作成しています。だから私は自分のアクティビティにPropertyChangeListenerを実装しました。スレッドからPropertyChangeイベントを発生させる方法は?
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);
}
}
、私は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);
}
}
また、私のアクティビティでMeasureオブジェクトを作成し、このインスタンスをRecorderスレッドに渡しました。 $ CalledFromWrongThreadException:ビュー階層を作成した元のスレッドのみがそのビューに触れることができます。
ありがとう、これが私の問題を解決しました – dieters