Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 清除/取消后计时器快速启动_Android_Timer - Fatal编程技术网

Android 清除/取消后计时器快速启动

Android 清除/取消后计时器快速启动,android,timer,Android,Timer,我正在尝试更改计时器的时间段 package com.chukree.thumbsdown; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; impo

我正在尝试更改计时器的时间段

package com.chukree.thumbsdown;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Timer;
import java.util.TimerTask;

public class GameActivity extends Activity {

    Button btnTap;
    Timer timer = new Timer();
    int seconds = 0;
    long timerPeriod = 1000;
    private int multiple = 3;
    private int score = 0;
    TextView tvScore;
    TimerTask myTimerTask;
    private boolean gameStarted = false;
    String TAG = GameActivity.class.toString();

    private class OnTapTimerTask extends TimerTask{

        @Override
        public void run() {

            seconds += 1;

            if(score > 2){
                restartTimer();
            }

            if(seconds > 200){
                Log.d(TAG, "Timer Period: " + timerPeriod);
                timer.cancel();
            }

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    btnTap.setText(String.valueOf(seconds));
                    Toast.makeText(getApplicationContext(), "" + timerPeriod, Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);

        btnTap = (Button) findViewById(R.id.button_tap);
        tvScore = (TextView) findViewById(R.id.tvScore);
        myTimerTask = new OnTapTimerTask();

        btnTap.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (timerPeriod > 500 && gameStarted) {
                    timerPeriod -= 50;
                }

                if (btnTap.getText().toString().equals("Start")) {
                    //Enable timer
                    timer.schedule(myTimerTask, 0, timerPeriod);

                    // Enable Pause Button

                    // Set "GameStarted" to true
                    gameStarted = true;

                    // set "lastTapNum" to 0

                } else if (Integer.parseInt(btnTap.getText().toString()) % multiple == 0) {
                    score += 1;
                    tvScore.setText("" + score);
                }

            }
        });
    }

    private void restartTimer() {

        myTimerTask.cancel();
        timer.purge();
//        timer = new Timer();
        myTimerTask = new OnTapTimerTask();
        timer.schedule(myTimerTask, 0, timerPeriod);

    }

    @Override
    protected void onPause() {
        timer.cancel();
        super.onPause();
    }
}
但是当计时器在不到一秒的时间内发出200次以上(分数>2)时,它会非常快速地发出


对这种奇怪行为有什么可能的解释吗?

确保线程运行实例不多的一种方法是使用1初始化线程。javadocs有一个关于如何使用它的示例

我猜它是在一次又一次地递归调用自己。。当run()时,如何确保只调用一次?