Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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
Java 如何为Resume按钮创建TimerTask的新实例?(错误:已计划TimerTask)_Java_Android_Timertask - Fatal编程技术网

Java 如何为Resume按钮创建TimerTask的新实例?(错误:已计划TimerTask)

Java 如何为Resume按钮创建TimerTask的新实例?(错误:已计划TimerTask),java,android,timertask,Java,Android,Timertask,早上好!我正在尝试为我的游戏执行暂停按钮,但是当我想继续游戏时,在初始化计时器任务时遇到问题 我得到错误“java.lang.IllegalStateException:TimerTask已被调度”,根据我的研究,这是因为TimerTask无法重用,因此必须为其创建一个新实例。我试着在我的主要活动中制作一个方法,用于此目的,但是,没有成功。这就是我正在处理的问题: public class MainActivity extends AppCompatActivity{ public Fi

早上好!我正在尝试为我的游戏执行暂停按钮,但是当我想继续游戏时,在初始化计时器任务时遇到问题

我得到错误“java.lang.IllegalStateException:TimerTask已被调度”,根据我的研究,这是因为TimerTask无法重用,因此必须为其创建一个新实例。我试着在我的主要活动中制作一个方法,用于此目的,但是,没有成功。这就是我正在处理的问题:

public class MainActivity extends AppCompatActivity{
    public FishView gameView;

    //pause variables
    Button pauseButton;
    private boolean pauseFlag = false;

    private final long animationPeriod = 600;
    Timer movementTimer;

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

        screen = findViewById(R.id.gameScreen);
        gameView = new FishView(this);
        screen.addView(gameView);

        pauseButton = findViewById(R.id.pauseButton);

        movementTimer = new Timer();
        movementTimer.scheduleAtFixedRate(animationTask, 0, animationPeriod);
    }

    //this is the timer I want to reuse 
    private TimerTask animationTask = new TimerTask() {
        @Override
        public void run() {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    //set animation
                    int selectedFish = gameView.getSelectedFish();
                    if (selectedFish==1){
                        gameView.setSelectedFish(0);}
                    if (selectedFish==0){
                        gameView.setSelectedFish(1); }

                    //update screen
                    gameView.invalidate();

                }
            });
        }
    };


     public void pauseGame(View v){
        String resume = "Resume";
        String pause = "Pause";
        if (!pauseFlag){
            System.out.println("Turning timer of");
            pauseFlag = true;
            pauseButton.setText(resume);
            movementTimer.cancel();
            movementTimer=null;
        }
        else{
            System.out.println("Starting timer again");
            pauseFlag=false;
            pauseButton.setText(pause);
            try{
                movementTimer = new Timer();
                TimerTask newAnimationTask; //this did not work
                createNewAnimationTask(newAnimationTask); //this did not work
                movementTimer.scheduleAtFixedRate(animationTask, 0, animationPeriod); //here is where the error occurs
}
            catch (Exception e){
                System.out.println("ERROR: " + e);}

        }
    }

   //attempted to make method that would generate new TimerTasks
   public void createNewAnimationTask(TimerTask newAnimationTask){
        newAnimationTask = new TimerTask() {
        @Override
        public void run(){
            handler.post(new Runnable() {
                @Override
                public void run() {
                    System.out.println("Animation at work");
                    //here we set the animation
                    int selectedFish = gameView.getSelectedFish();
                    if (selectedFish==1){
                        gameView.setSelectedFish(0);}
                    if (selectedFish==0){
                        gameView.setSelectedFish(1); }

                    //update screen
                    gameView.invalidate();

                }
            });
        }
    };
    }



}

我想知道的是,每当我按下resume按钮时,如何创建一个新的TimerTask(如“animationTask”)。

尝试添加
purge
命令

movementTimer.cancel(); 
movementTimer.purge();

我解决了。我删除了所有TimerTask,只是在一个函数中创建了所有内容,如下所示:

public void createNewAnimationTask(){
        movementTimer = new Timer();
        TimerTask newAnimationTask = new TimerTask() {
            @Override
            public void run() {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("Animation at work");
                        //here we set the animation
                        int selectedFish = gameView.getSelectedFish();
                        if (selectedFish==1){
                            gameView.setSelectedFish(0);}
                        if (selectedFish==0){
                            gameView.setSelectedFish(1); }

                        //update screen
                        gameView.invalidate();
                    }
                });
            }
        };
        movementTimer.scheduleAtFixedRate(newAnimationTask, 0, animationPeriod);
    }




显示LogCat错误LogCat错误相同。也就是说:java.lang.IllegalStateException:TimerTask已经安排好了@ErikI已经完成了如上所示的任务,我也尝试过“purge()”,但没有任何帮助。问题不在于计时器,而在于计时器任务。我需要能够以某种方式生成新的TimerTask。最好不必为它创建新类。检查这个,我现在发布了一个新的工作解决方案。你知道如何将重复的代码只写一个吗?难道你不能直接从
onCreate
调用
pauseGame(视图v)
,设置字段
pauseFlag=true
,而不是在
onCreate
中启动计时器吗,但我现在只是把所有的东西都放在一个函数中,这样每当我想启动一个新的计时器时,我都可以调用它。