有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何创建一个完美的延迟时间,使其只计算一次

你好,我正在使用一个jumpingApp,它会计算你跳了多少次,我正在使用加速计传感器。 我遇到的问题是,我真的不知道如何设置延迟,所以它是完美的,有时一个跳转算作两个跳转,有时它没有注册,有时它工作得很好。我希望每次计数跳跃都能有0.4秒左右的时间

private TextView textView;
private TextView text;
private SensorManager sensorManager;
double ax,ay,az;
boolean newJumpAccepted = true;
int numbersOfJumps = 0;
long startTime = 0;
int count;
MediaPlayer mediaPlayer;
Handler timerHandler = new Handler();
Runnable timerRunnable = new Runnable() {
    @Override
    public void run() {
        long millis = System.currentTimeMillis() - startTime;

        if(millis>400){
            newJumpAccepted = true;
        } else {
            newJumpAccepted = false;
        }


        int seconds = (int) (millis / 1000);
        int minutes = seconds / 60;
        seconds = seconds % 60;
        timerHandler.postDelayed(this,500);
    }
};


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);
    sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_FASTEST);
    text = (TextView) findViewById(R.id.text);
    textView = (TextView) findViewById(R.id.textView);
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
}

@Override
public void onSensorChanged(SensorEvent event){
    SharedPreferences preferences =      PreferenceManager.getDefaultSharedPreferences(this);
    String result = "";
    double d = Math.round(event.values[1]);
    float threshold = preferences.getFloat("hello", 11);
    if (d != 0 && d >= threshold && newJumpAccepted){
        count++;
    }
    Log.i("hej", String.valueOf(d));
    text.setText("Jump made" + " " + count + " " + d);
    text.invalidate();
    startTime();
}

private void startTime() {
    if(newJumpAccepted) {
        startTime = System.currentTimeMillis();
        timerHandler.postDelayed(timerRunnable, 0);
    }
    newJumpAccepted = false;
}
}

共 (1) 个答案

  1. # 1 楼答案

    Timer timer;
    MyTimerTask myTimerTask;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);
        sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_FASTEST);
        text = (TextView) findViewById(R.id.text);
        textView = (TextView) findViewById(R.id.textView);
    
        if(timer != null){
            timer.cancel();
        }
    
        timer = new Timer();
        myTimerTask = new MyTimerTask();
    
        timer.schedule(myTimerTask, 400, 400);
    }
    
    class MyTimerTask extends TimerTask {
    
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
    
                @Override
                public void run() {
    
                    if (!newJumpAccepted) {
                        text.setText(String.valueOf(count));
                        newJumpAccepted = true;
                    }
                }
            });
        }
    }