我目前正在Android中开发一款应用程序,它会将传感器数据记录一段固定的时间,持续几个周期。例如,我计划将数据记录10秒钟,然后停止,让手机休息10秒钟,然后重新开始记录,......按此模式工作1小时。我的问题是,如何让手机自动执行此计划?我目前正在使用下面的代码(来自Android: How to collect sensor values for a fixed period of time?),但它仅适用于一个周期,我必须在确定上一个周期结束后手动启动新周期。
public void onResume() {
mSensorManager.registerListener(mListener, mSensorAcceleration, SensorManager.SENSOR_DELAY_GAME);
mSensorManager.registerListener(mListener, mSensorMagnetic, SensorManager.SENSOR_DELAY_GAME);
Handler h = new Handler();
h.postDelayed(new Runnable() {
@Override
public void run() {
// do stuff with sensor values
mSensorManager.unregisterListener(mListener);
}
}, 10000);
...
任何帮助将不胜感激!!
答案 0 :(得分:2)
我认为有更好,更正确的方法来实现这一点。具体来说,我认为让Activity
实施Runnable
是错误的。它在其公共接口中泄漏逻辑,应该保持私有(和隐藏)。即没有人应该在活动之外调用run()
。我建议如下实现它:
public class PostDelayedDemo extends Activity {
// Declaration of sensor-related fields.
private static final int PERIOD = 10000;
private Handler handler;
private final Runnable processSensors =
new Runnable() {
@Override
public void run() {
mSensorManager.registerListener(mListener, mSensorAcceleration, SensorManager.SENSOR_DELAY_GAME);
mSensorManager.registerListener(mListener, mSensorMagnetic, SensorManager.SENSOR_DELAY_GAME);
// Do work with the sensor values.
mSensorManager.unregisterListener(mListener);
// The Runnable is posted to run again here:
handler.postDelayed(this, PERIOD);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
handler = new Handler();
}
@Override
public void onResume() {
super.onResume();
handler.post(processSensors);
}
@Override
public void onPause() {
handler.removeCallbacks(processSensors);
super.onPause();
}
}
答案 1 :(得分:0)
步骤1:让您的活动实施Runnable
,而不是使用匿名内部类,移动您在活动上实施的run()
方法。
步骤2:在run()
方法中,安排自己(活动)在使用postDelayed()
延迟后再次运行。这个加上您对postDelayed()
的现有号召,将有效地定期拨打run()
。
步骤3:跟踪您是处于“传感器开启”模式还是“传感器关闭”模式,并在run()
中注册或取消注册听众。
步骤4:在onPause()
中,拨打removeCallbacks()
上的Handler
,停止定期拨打run()
。
您将在this sample project中看到此类计划的示例 - 自己再次运行的逻辑。这是活动:
package com.commonsware.android.post;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class PostDelayedDemo extends Activity implements Runnable {
private static final int PERIOD=5000;
private View root=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
root=findViewById(android.R.id.content);
}
@Override
public void onResume() {
super.onResume();
run();
}
@Override
public void onPause() {
root.removeCallbacks(this);
super.onPause();
}
@Override
public void run() {
Toast.makeText(PostDelayedDemo.this, "Who-hoo!", Toast.LENGTH_SHORT)
.show();
root.postDelayed(this, PERIOD);
}
}