我想每 X 秒执行一次代码,但 handler.postDelayed 不工作
I want to execute code every X seconds, but handler.postDelayed not working
好的,所以我想每隔 X 秒将加速度计值注册到我的数据库中。他接受了第一个延迟,但忽略了第二个 handler.postDelayed,有人知道它会是什么吗?我试过使用计时器,但它也不起作用,所以我有点 运行 没有选择...
代码如下:
public class MainActivity extends AppCompatActivity implements SensorEventListener{
private Button receiveButton;
private ListView listView;
private DatabaseReference database;
private ArrayAdapter<String> adapter;
private List<String> items;
private SensorManager sensorManager;
private Sensor senAccelerometer;
private Handler handler = new Handler();
private final int delay = 5000; //in milliseconds
private Accelerometer accelerometer;
private float xValue;
private float yValue;
private float zValue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
senAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(this, senAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
receiveButton = findViewById(R.id.receiveButton);
listView = findViewById(R.id.listView);
database = FirebaseDatabase.getInstance().getReference("Accelerometer");
items = new ArrayList<>();
items.add("X Value: " + Float.toString(xValue));
items.add("Y Value: " + Float.toString(yValue));
items.add("Z Value: " + Float.toString(zValue));
updateUI();
receiveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
database.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Accelerometer accelerometer = dataSnapshot.getValue(Accelerometer.class);
xValue = accelerometer.xValue;
yValue = accelerometer.yValue;
zValue = accelerometer.zValue;
for (Iterator<String> iterator = items.iterator(); iterator.hasNext();){
iterator.next();
iterator.remove();
}
items.add("X Value: " + Float.toString(xValue));
items.add("Y Value: " + Float.toString(yValue));
items.add("Z Value: " + Float.toString(zValue));
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
updateUI();
}
});
}
private void updateUI(){
if(adapter == null){
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, items);
listView.setAdapter(adapter);
} else{
adapter.notifyDataSetChanged();
}
}
@Override
public void onSensorChanged(final SensorEvent sensorEvent) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
if(sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
accelerometer = new Accelerometer(sensorEvent.values[0], sensorEvent.values[1], sensorEvent.values[2]);
}
database.setValue(accelerometer);
handler.postDelayed(this, delay);
}
}, delay);
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
}
提前致谢!
你应该使用这个模式:
Handler handler = new Handler()
Runnable yourRunnable = new Runnable()
{
@Override
public void run() {
doYourAction();
handler.postDelayed(yourRunnable, UPDATE_INTERVAL);
}
};
您可以尝试使用 AsyncTask 进行递归调用。类似于:
public void checkAccelerometer() {
final Handler handler = new Handler();
new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute() {
//Update UI if you want/need to
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... voids) {
//Do your thing
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
checkAccelerometer();
}
}, 5000);
super.onPostExecute(aVoid);
}
}.execute();
}
这将在后台线程中执行您的代码,并在 5 秒后调用自身以重复继续。如果您想要一种停止此循环的方法,您可以在开头将所有内容都放入 if 语句中,并检查您可以在其他地方控制的布尔值。
我解决了,只好放到oncreate方法里了。因为如果你把它放在 onSensorChanged 中,它会在每次数据更改时执行。因此,如果您在 onSensorChanged 之外执行数据,它将只执行一次,这将确保它不会每 .5 毫秒无限更新一次。
好的,所以我想每隔 X 秒将加速度计值注册到我的数据库中。他接受了第一个延迟,但忽略了第二个 handler.postDelayed,有人知道它会是什么吗?我试过使用计时器,但它也不起作用,所以我有点 运行 没有选择...
代码如下:
public class MainActivity extends AppCompatActivity implements SensorEventListener{
private Button receiveButton;
private ListView listView;
private DatabaseReference database;
private ArrayAdapter<String> adapter;
private List<String> items;
private SensorManager sensorManager;
private Sensor senAccelerometer;
private Handler handler = new Handler();
private final int delay = 5000; //in milliseconds
private Accelerometer accelerometer;
private float xValue;
private float yValue;
private float zValue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
senAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(this, senAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
receiveButton = findViewById(R.id.receiveButton);
listView = findViewById(R.id.listView);
database = FirebaseDatabase.getInstance().getReference("Accelerometer");
items = new ArrayList<>();
items.add("X Value: " + Float.toString(xValue));
items.add("Y Value: " + Float.toString(yValue));
items.add("Z Value: " + Float.toString(zValue));
updateUI();
receiveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
database.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Accelerometer accelerometer = dataSnapshot.getValue(Accelerometer.class);
xValue = accelerometer.xValue;
yValue = accelerometer.yValue;
zValue = accelerometer.zValue;
for (Iterator<String> iterator = items.iterator(); iterator.hasNext();){
iterator.next();
iterator.remove();
}
items.add("X Value: " + Float.toString(xValue));
items.add("Y Value: " + Float.toString(yValue));
items.add("Z Value: " + Float.toString(zValue));
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
updateUI();
}
});
}
private void updateUI(){
if(adapter == null){
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, items);
listView.setAdapter(adapter);
} else{
adapter.notifyDataSetChanged();
}
}
@Override
public void onSensorChanged(final SensorEvent sensorEvent) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
if(sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
accelerometer = new Accelerometer(sensorEvent.values[0], sensorEvent.values[1], sensorEvent.values[2]);
}
database.setValue(accelerometer);
handler.postDelayed(this, delay);
}
}, delay);
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
}
提前致谢!
你应该使用这个模式:
Handler handler = new Handler()
Runnable yourRunnable = new Runnable()
{
@Override
public void run() {
doYourAction();
handler.postDelayed(yourRunnable, UPDATE_INTERVAL);
}
};
您可以尝试使用 AsyncTask 进行递归调用。类似于:
public void checkAccelerometer() {
final Handler handler = new Handler();
new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute() {
//Update UI if you want/need to
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... voids) {
//Do your thing
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
checkAccelerometer();
}
}, 5000);
super.onPostExecute(aVoid);
}
}.execute();
}
这将在后台线程中执行您的代码,并在 5 秒后调用自身以重复继续。如果您想要一种停止此循环的方法,您可以在开头将所有内容都放入 if 语句中,并检查您可以在其他地方控制的布尔值。
我解决了,只好放到oncreate方法里了。因为如果你把它放在 onSensorChanged 中,它会在每次数据更改时执行。因此,如果您在 onSensorChanged 之外执行数据,它将只执行一次,这将确保它不会每 .5 毫秒无限更新一次。