Android几种定时器的使用

前言

开发工具: Android studio 3.5
第一种:Chronometer
activity_chronometer_timer.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".timer.ChronometerActivity"
    android:orientation="vertical"
    android:gravity="center_horizontal">

    <Chronometer
        android:id="@+id/chronometer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:format="%s"
        android:textSize="18sp"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/start"
        android:onClick="startClick"/>


    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/stop"
        android:onClick="stopClick"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/reset"
        android:onClick="resetClick"/>

</LinearLayout>


import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Chronometer;

import com.thomas.android.base.R;

public class ChronometerTimerActivity extends AppCompatActivity {

    private Chronometer chronometer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chronometer_timer);
        chronometer = findViewById(R.id.chronometer);
        initView();

    }

    private void initView() {
        chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
            @Override
            public void onChronometerTick(Chronometer chronometer) {

                // 定时任务
                long timeDifference = SystemClock.elapsedRealtime() - chronometer.getBase();
                if (timeDifference % 4000 <= 1000){
                    System.out.println(" every four seconds do something here"+SystemClock.elapsedRealtime() );
                }


            }
        });
    }

    /**
     * 开始计时
     * 补充:
     * System.currentTimeMillis() SystemClock.elapsedRealtime()区别和使用 README.md
     */
    public void startClick(View view) {
        //设置开始计时时间
        chronometer.setBase(SystemClock.elapsedRealtime());
        //启动计时器
        chronometer.start();
    }

    public void stopClick(View view) {
        chronometer.stop();
    }

    public void resetClick(View view) {
        chronometer.setBase(SystemClock.elapsedRealtime());
        chronometer.stop();
    }

}

效果图
Android几种定时器的使用_第1张图片

第二种:Timer

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import com.thomas.android.base.R;

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


public class TimerActivity extends AppCompatActivity {

    private Timer timer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_timer);
        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(" every four seconds to do ");

            }
        },1000,4000);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        timer.cancel();
    }
}

第三种:Handler

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;

import com.thomas.android.base.R;

public class HandlerTimerActivity extends AppCompatActivity {

    private Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_handler_timer);
        initHandler();
    }

    private void initHandler() {
        // I use HandlerThread in order to avoid blocking UI
        HandlerThread handlerThread = new HandlerThread("handler timer");
        handler = new Handler(handlerThread.getLooper());
        handler.postDelayed(timerRunnable ,0);
    }

    /**
     * timer task here
     */
    private Runnable timerRunnable = new Runnable() {
        @Override
        public void run() {
            System.out.println(" task here ");
            handler.postDelayed(this,4000);

        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        handler.removeCallbacksAndMessages(null);
    }
}

第四种:Thread

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;

import com.thomas.android.base.R;

public class ThreadTimerActivity extends AppCompatActivity {

    private TextView tv_timer;
    private boolean flag = true;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_thread_timer);
        tv_timer = findViewById(R.id.tv_timer);
        initThread();

    }

    private void initThread() {
        TimerThread thread = new TimerThread();
        thread.start();

    }


    private class TimerThread extends Thread{
        @Override
        public void run() {
            super.run();
            while (flag){
                try {
                    Thread.sleep(4000);
                    // if you want to refresh Ui , you need to use Handler
                    System.out.println(" every four seconds to do ");
                    Message message = new Message();
                    message.obj = "every four seconds to do";
                    handler.sendMessage(message);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }
    }
    
    private Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(@NonNull Message message) {
            tv_timer.setText((String) message.obj);
            return false;
        }
    });

    @Override
    protected void onDestroy() {
        super.onDestroy();
        flag = false;
        handler.removeCallbacksAndMessages(null);
    }
}

项目地址:
链接:https://pan.baidu.com/s/1qGdB4igXADFM5MMcQkHxKA
提取码:aq6t

你可能感兴趣的:(Android几种定时器的使用)