2012-04-26 12 views
2

私は、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:ビュー階層を作成した元のスレッドのみがそのビューに触れることができます。

答えて

関連する問題