Android简单计时器详解(Timer)

来源:互联网 发布:知乎重复回答会删除吗 编辑:程序博客网 时间:2024/05/01 19:16

Android计时器详解(Timer)

在开发中我们有时会有这样的需求,即在固定的每隔一段时间执行某一个任务。比如UI上的控件需要随着时间改变,我们可以使用Java为我们提供的计时器的工具类,即Timer和TimerTask。

API

Timer是一个普通的类,其中有几个重要的方法;而TimerTask则是一个抽象类,其中有一个抽象方法run(),类似线程中的run()方法,我们使用Timer创建一个他的对象,然后使用这对象的schedule方法来完成这种间隔的操作。

Android考虑到线程安全问题,不允许在线程中执行UI线程。
android.os.Handler,这个可以实现各处线程间的消息传递。

schedule方法有三个参数第一个参数就是TimerTask类型的对象,我们实现TimerTask的run()方法就是要周期执行的一个任务;第二个参数有两种类型,第一种是long类型,表示多长时间后开始执行,另一种是Date类型,表示从那个时间后开始执行;第三个参数就是执行的周期,为long类型。schedule方法还有一种两个参数的执行重载,第一个参数仍然是TimerTask,第二个表示为long的形式表示多长时间后执行一次,为Date就表示某个时间后执行一次。?Timer就是一个线程,使用schedule方法完成对TimerTask的调度,多个TimerTask可以共用一个Timer,也就是说Timer对象调用一次schedule方法就是创建了一个线程,并且调用一次schedule 后TimerTask是无限制的循环下去的,使用Timer的cancel()停止操作。当然同一个Timer执行一次cancel()方法后,所有Timer线程都被终止。

用法

    java.util.Timer timer = new java.util.Timer(true);  TimerTask task = new TimerTask() {     public void run() {     //每次需要执行的代码放到这里面。        }     };  //以下是几种调度task的方法:  //time为Date类型:在指定时间执行一次。  timer.schedule(task, time);  //firstTime为Date类型,period为long,表示从firstTime时刻开始,每隔period毫秒执行一次。  timer.schedule(task, firstTime, period);     //delay 为long类型:从现在起过delay毫秒执行一次。  timer.schedule(task, delay);  //delay为long,period为long:从现在起过delay毫秒以后,每隔period毫秒执行一次。  timer.schedule(task, delay, period);

演示图

这里写图片描述

代码

布局代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:orientation="vertical"    android:layout_height="match_parent" >    <EditText        android:id="@+id/inputtime"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:ems="10" >        <requestFocus />    </EditText>    <Button        android:id="@+id/gettime"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="获取倒计时时间" />    <TextView        android:id="@+id/time"        android:layout_width="wrap_content"        android:layout_height="wrap_content"         />    <Button        android:id="@+id/starttime"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="开始计时" />    <Button        android:id="@+id/stoptime"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="停止计时" /></LinearLayout>

逻辑实现代码

package com.example.tmier;import java.util.Timer;import java.util.TimerTask;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;public class MainActivity extends Activity implements OnClickListener {    private EditText inputet;//输入时间    private Button getTime;//得到输入的时间    private Button startTime;//点击开始自动减少时间的按钮    private Button stopTime;//点击开始停止自动减少时间的按钮    private TextView time;//当前时间    private int i = 0;    private Timer timer = null;//计时器    private TimerTask timerTask = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initviews();//初始化视图        setOnclick();//设置视图的点击监听    }    private void setOnclick() {         getTime.setOnClickListener(this);         startTime.setOnClickListener(this);         stopTime.setOnClickListener(this);    }    private void initviews() {        inputet = (EditText) findViewById(R.id.inputtime);        getTime = (Button) findViewById(R.id.gettime);        startTime = (Button) findViewById(R.id.starttime);        stopTime = (Button) findViewById(R.id.stoptime);        time = (TextView) findViewById(R.id.time);    }    @Override    public void onClick(View v) {        switch (v.getId()) {        case R.id.gettime:            time.setText(inputet.getText().toString());//当前时间            i = Integer.parseInt(inputet.getText().toString());//当前输入时间            break;        case R.id.starttime://开始自动减时            startTime();            break;        case R.id.stoptime://停止自动减时            stopTime();            break;        }    }    private Handler mHandler = new Handler(){        public void handleMessage(android.os.Message msg) {            time.setText(msg.arg1+"");            startTime();        };    };    /**     * 开始自动减时     */    private void startTime() {        if(timer==null){            timer = new Timer();        }        timerTask = new TimerTask() {            @Override            public void run() {                i--;//自动减1                Message message = Message.obtain();                message.arg1=i;                mHandler.sendMessage(message);//发送消息            }        };        timer.schedule(timerTask, 1000);//1000ms执行一次    }    /**     * 停止自动减时     */    private void stopTime() {        if(timer!=null)            timer.cancel();    }}
1 0