1.Timer + TimerTask 实现
private MyTimerTask mMyTimerTask;
private Timer mTimer;
private long count;
private class MyTimerTask extends TimerTask {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
count++;
TextView tv = findViewById(R.id.tv);
tv.setText("" + count);
}
});
}
}
//开始计时
private void startTimerTask() {
stopTimerTask();//防止 多次调用 Timer.schedule 报错
if (mTimer == null) {
mTimer = new Timer(true);
}
if (mMyTimerTask == null) {
mMyTimerTask = new MyTimerTask();
}
mTimer.schedule(mMyTimerTask, 1000, 1000);//延时 1000 毫秒 并以 1000 毫秒 周期 循环执行
}
//结束计时
public void stopTimerTask() {
if (mTimer != null) {
mTimer.cancel();
mTimer = null;
}
if (mMyTimerTask != null) {
mMyTimerTask.cancel();
mMyTimerTask = null;
}
}
2. Handler 实现 (毫秒值在100 以上时,计时相对准确)
public class MainActivity extends AppCompatActivity {
private MyHandler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHandler=new MyHandler(Looper.getMainLooper());
}
}
private final int TIME_START = 1001;
private final int TIME_STOP = 1002;
private final int TIME_RUN = 1003;
private long count;
private class MyHandler extends Handler {
public MyHandler(@NonNull Looper looper) {
super(looper);
}
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what) {
case TIME_START:
postDelayed(mRunable, 1000);//延时 1000 毫秒执行
break;
case TIME_STOP:
removeCallbacks(mRunable);
break;
case TIME_RUN:
count++;
TextView tv = findViewById(R.id.tv_2);
tv.setText("" + count);
break;
}
}
};
private Runnable mRunable = new Runnable() {
@Override
public void run() {
mHandler.sendEmptyMessage(TIME_RUN);
mHandler.postDelayed(this, 1000);//延时 1000 毫秒执行(循环执行)
}
};
//开始计时
private void startHandlerTimer(){
mHandler.sendEmptyMessage(TIME_START);
}
//停止计时
private void stopHandlerTimer(){
mHandler.sendEmptyMessage(TIME_STOP);
}
3.Thread + Handler 实现
public class MainActivity extends AppCompatActivity {
private CMHandler mCMHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCMHandler=new CMHandler();
}
}
private final int TIMER_RUN = 100;
private boolean canRun=true;
private long count;
private class CMHandler extends Handler {
public CMHandler(@NonNull Looper looper) {
super(looper);
}
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what) {
case TIMER_RUN:
count++;
TextView tv = findViewById(R.id.tv_3);
tv.setText("" + count);
break;
}
}
}
//开始计时
private void startTimer(){
canRun=true;
new Thread(new Runnable() {
@Override
public void run() {
while (canRun){//循环
try {
Thread.sleep(1000);//睡眠 1000 毫秒执行
} catch (InterruptedException e) {
e.printStackTrace();
}
mCMHandler.sendEmptyMessage(TIMER_RUN);
}
}
}).start();
}
//停止计时
private void stopTimer(){
canRun=false;
}