对传感器数据使用 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;
}
}
还有许多其他方法可以做到这一点...
我有一个需要调整的工作应用程序。我正在尝试使用 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;
}
}
还有许多其他方法可以做到这一点...