timer.cancel()是否将计时器返回为null?

我在java中有一个timer对象。以下是我的代码:

package com.krish.timerproject;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;

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

public class MainActivity extends AppCompatActivity {

    Button btnStart, btnStop, btnPause;

    int  x = 0;

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

        btnStart = findViewById(R.id.btnStart);
        btnPause = findViewById(R.id.btnPause);
        btnStop = findViewById(R.id.btnStop);




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

                if (timer != null){
                    return;
                }
                timer = new Timer();

                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        Log.d("testingTimer", String.valueOf(x));
                        x++;
                    }
                }, 0, 1000);
            }
        });

        btnPause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (timer != null){
                    timer.cancel();
                }

            }
        });

        btnStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (timer != null){
                    timer.cancel();
                }
                x=0;

            }
        });
    }
}

如果我调用timer.cancel(),它是终止计时器并返回null,还是计时器对象仍然存在?因此,我必须在timer.cancel()之后设置timer = null;吗?

我想知道这是因为当我点击暂停按钮,然后开始按钮,我的计时器没有恢复(它进入了if(timer !=null){return;}谢谢!!

✅ 最佳回答:

来自java.util.Timer#cancel的Javadoc:

终止此计时器,放弃任何当前计划的任务。不干扰当前正在执行的任务(如果存在)。一旦计时器被终止,它的执行thread就会优雅地终止,并且不能在它上面安排更多的任务。请注意,在此计时器调用的计时器任务的run方法中调用此方法绝对可以确保正在进行的任务执行是此计时器将执行的最后一个任务执行。此方法可能会被重复调用;第二次和随后的调用没有效果。

如您所见,它取消计划任务而不中断正在运行的任务。

当您这样做时,timer对象会更改其状态,但它不会将自己设置为null

此外,对象无法修改对自身的引用,因此无法设置自身null,因为this是主表达式。

在程序中,必须明确地将timer对象设置为null