对传感器数据使用 postDelayed

Using postDelayed for Sensor Data

我有一个需要调整的工作应用程序。我正在尝试使用 postDelayed 方法让标签每 'n' 秒更新一次,但我只是让它延迟它首次显示的时间而不是经常更新标签。我已经尝试了多种使用带有 postDelayed 的 Runnable 方法的方法,但除了再次延迟初始 post 之外,我什么也做不了。对于如何让它工作的任何反馈或建议,我将不胜感激。 "textLightReading.setText" 是我要延迟更新的标签。

`@Override
public void onSensorChanged(final SensorEvent event) {

    if (event.sensor.getType() == Sensor.TYPE_LIGHT) {
        final Handler mHandler = new Handler();
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mHandler.postDelayed(this, 1000);
                final float lux = event.values[0];
                final float conversion = Math.round(((1/638f) * lux) * 100.0f)/100.0f;
                textLightReading.setText("Light: " + conversion);
            }
        }, 1000);
    }
}`

这是另一种尝试...

`@Override
public void onSensorChanged(final SensorEvent event) {

    if (event.sensor.getType() == Sensor.TYPE_LIGHT) {
        float lux = event.values[0];
        final float conversion = Math.round(((1/638f) * lux) * 100.0f)/100.0f;
        final Handler mHandler = new Handler();
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                textLightReading.setText("Light: " + conversion);
                //mHandler.postDelayed(this, 1000);
            }
        }, 1000);
    }
}`

我确定我只是不明白如何使用它。再次感谢。

试试这个 第一种方法

  Handler mHandler = new Handler();
  float lux,conversion;// intialize it
  Runnable run=new Runnable() {

    @Override
    public void run() {

            textLightReading.setText("Light: " + conversion);
            //Line to kill runnable before a new one starts
            mHandler.removeCallbacks(run);

    }
};

  //it will update 1 second after onSensorChanged called and when condition true
  //As per your both attempts
  @Override
public void onSensorChanged(final SensorEvent event) {

if (event.sensor.getType() == Sensor.TYPE_LIGHT) {

     lux = event.values[0];
     conversion = Math.round(((1/638f) * lux) * 100.0f)/100.0f;
    mHandler.postDelayed(run, 1000);

  }
}

让标签每 'n' 秒更新一次并不重要,如果调用了 onSensorChanged

第二种方法第 1 部分: //定时器的使用

 Timer swipeTimer = new Timer();
 swipeTimer.schedule(new TimerTask() {

            @Override
            public void run() {
                mHandler.post(run);
            }
        }, 500, 500); //put this onCreateView or at initialization

注意:当不再需要定时器时,用户应该调用取消,释放定时器的线程和其他资源。未明确取消的计时器可能会无限期地占用资源。

第二种方法第 2 部分:您的问题中提到的类似方法

  Handler mHandler = new Handler();
  Runnable run=new Runnable() {

    @Override
    public void run() {


            textLightReading.setText("Light: " + conversion); //update textView 
              mHandler.postDelayed(run, 1000);
    }
};


              mHandler.post(run); // at initialization or anywhere in your code where you want to start handler

  @Override
public void onSensorChanged(final SensorEvent event) {

if (event.sensor.getType() == Sensor.TYPE_LIGHT) {

     lux = event.values[0];
     conversion = Math.round(((1/638f) * lux) * 100.0f)/100.0f;

  }
}

还有许多其他方法可以做到这一点...