2

maxDbRecordedクラスのプロパティが変更されたときにラベルを更新したいAndroidアプリを作成していMeasureます。そこで、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ここで、スレッド内で from の値を設定したいと思います。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 イベントは発生しません。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: ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます。

4

1 に答える 1

1

android Handler クラスを使用して、それを介して ui スレッドに呼び出しを投稿する必要があります。

チェック: http://www.vogella.com/articles/AndroidPerformance/article.html

于 2012-04-26T21:06:42.777 に答える