Android使用Timer编写倒计时程序

开篇大家可以先看看Timer的基础用法,以及简单的原理。http://my.oschina.net/zhengweishan/blog/493891 Java之Timer使用。这里我要说的是Android使用Timer编写一个倒计时程序。

需求:实现简单的倒计时程序。要求可以根据用户的输入实现倒计时,时间到的时候有友好的提示。

分析:首先要实现这个功能,我想到的第一个方法就是使用Timer这个类。然后就是分析用户界面怎么设计,由于这个是简单程序,所以就采用Android原生的一些UI组件Button TextView EditText来设计基本的页面。友好提示我打算使用Toast这种机制。这里打算让用户输入分秒。

源码下载地址:https://git.oschina.net/zhengweishan/AndroidTimer

Activity代码:

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;

import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

private Button startButton;

private Button stopButton;

private EditText minuteText;

private EditText secondText;

private TextView myTime;

private int minute = 0;

private int second = 0;

private Timer timer = null;

private TimerTask task = null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

}

private void initView() {

startButton = (Button) findViewById(R.id.startBtn);

stopButton = (Button) findViewById(R.id.stopBtn);

minuteText = (EditText) findViewById(R.id.minute);

secondText = (EditText) findViewById(R.id.second);

myTime = (TextView) findViewById(R.id.myTime);

startButton.setOnClickListener(this);

stopButton.setOnClickListener(this);

}

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

switch (v.getId()) {

case R.id.startBtn:

start();

break;

case R.id.stopBtn:

stop();

break;

}

}

public void start() {

if (!minuteText.getText().toString().equals("")) {

minute = Integer.parseInt(minuteText.getText().toString());

}

if (!secondText.getText().toString().equals("")) {

second = Integer.parseInt(secondText.getText().toString());

}

myTime.setText(minute + ":" + second);

task = new TimerTask() {

@Override

public void run() {

Message msg = new Message();

msg.what = 0;

mHandler.sendMessage(msg);

}

};

timer = new Timer();

timer.schedule(task, 0, 1000);

}

public void stop() {

timer.cancel();

}

public void timeProcess(){

if (minute == 0) {

if (second == 0) {

//myTime.setText("Time out!");

Toast.makeText(getApplicationContext(), "Time out!",5);

if (timer != null) {

timer.cancel();

timer = null;

}

if (task != null) {

task = null;

}

} else {

second--;

if (second >= 10) {

myTime.setText("0" + minute + ":" + second);

} else {

myTime.setText("0" + minute + ":0" + second);

}

}

} else {

if (second == 0) {

second = 59;

minute--;

if (minute >= 10) {

myTime.setText(minute + ":" + second);

} else {

myTime.setText("0" + minute + ":" + second);

}

} else {

second--;

if (second >= 10) {

if (minute >= 10) {

myTime.setText(minute + ":" + second);

} else {

myTime.setText("0" + minute + ":" + second);

}

} else {

if (minute >= 10) {

myTime.setText(minute + ":0" + second);

} else {

myTime.setText("0" + minute + ":0" + second);

}

}

}

}

}

private Handler mHandler = new Handler() {

public void handleMessage(Message msg) {

timeProcess();

};

};

}

xml布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context="com.example.androidtimer.MainActivity" >

<TextView

android:id="@+id/lable"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:layout_alignParentTop="true"

android:text="@string/lable" />

<EditText

android:id="@+id/minute"

android:layout_width="100dp"

android:layout_height="wrap_content"

android:layout_alignLeft="@+id/lable"

android:layout_below="@+id/lable"

android:layout_marginTop="40dp"

android:ems="10" />

<TextView

android:id="@+id/textView2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignBottom="@+id/minute"

android:layout_toRightOf="@+id/minute"

android:text="@string/minute" />

<EditText

android:id="@+id/second"

android:layout_width="100dp"

android:layout_height="wrap_content"

android:layout_toRightOf="@+id/textView2"

android:layout_below="@+id/lable"

android:layout_marginTop="40dp"

android:ems="10" />

<TextView

android:id="@+id/textView3"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_toRightOf="@+id/second"

android:layout_alignBottom="@+id/second"

android:text="@string/second" />

<TextView

android:id="@+id/myTime"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_above="@+id/startBtn"

android:layout_alignRight="@+id/textView3"

android:layout_margin="30dp"

android:gravity="center"

android:textColor="#FF0000"

android:textSize="60sp"

android:textStyle="bold" />

<Button

android:id="@+id/startBtn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignLeft="@+id/minute"

android:layout_alignParentBottom="true"

android:text="@string/startBtn" />

<Button

android:id="@+id/stopBtn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignBottom="@+id/startBtn"

android:layout_toRightOf="@+id/startBtn"

android:layout_alignRight="@+id/textView3"

android:layout_marginRight="40dp"

android:text="@string/stopBtn" />

</RelativeLayout>

string.xml文件:

<?xml version="1.0" encoding="utf-8"?>

<resources>

<string name="app_name">AndroidTimer</string>

<string name="hello_world">Hello world!</string>

<string name="action_settings">Settings</string>

<string name="lable">请设置时间:</string>

<string name="minute">分:</string>

<string name="second">秒</string>

<string name="startBtn">开始计时</string>

<string name="stopBtn">停止计时</string>

</resources>

时间: 2024-11-08 21:25:49

Android使用Timer编写倒计时程序的相关文章

Android获取验证码后倒计时程序

在开发是经常会遇到获取短信验证码,然后获取验证码后需要等待1分钟倒计时,这是是不能再次发送短信请求的,这是需要一个倒计时程序 这里我封装了一个Util类,希望对开发的小伙伴能有帮助, public class TimeCountUtil extends CountDownTimer { private Activity mActivity; private Button btn;//按钮 // 在这个构造方法里需要传入三个参数,一个是Activity,一个是总的时间millisInFuture,

【Qt for Android】第一个安卓程序

1)首先需要去官网上下载 Qt for android 版本的 Qt SDK 2)下载 android 相关的 SDK,下载地址不用找了,在Qt Creator工具选项的Android配置中有相应的下载链接地址. 3)下载完安卓SDK后,在上面的配置界面中指定相应SDK的目录,然后在"Build & Run"中新增Android的Kits 4)编写Qt代码后,点击"Run"即可,在弹出的Android设备列表中,选择程序要安装运行的Android设备.(下图

一名Android开发者的微信小程序填坑之路(1)

前言 首先要声明的是,我是一名 Android 开发者,之前基本没有前端开发经验,甚至连 JS ,HTML 都是为了开发小程序现学的一些皮毛--所以文章中所提到的一些点也许在资深前端开发者看来只是小case,但是站在一个 Android 开发者的角度来看确实是大坑. 前面就不说太多东西了,文章的末尾再谈谈我对小程序的一些看法--这篇文章主要是谈谈在开发小程序的过程中遇到的一些坑. PS:推荐一下我写的一个微信小程序版的Gank客户端:wechat-weapp-gank 正文 1,获取小程序开发工

[Android]实现简单的相机程序

好久没写了,有些东西做过都快忘了,赶紧记一下. 现在来实现一个简单的相机程序. 原文地址http://www.cnblogs.com/rossoneri/p/4246134.html 当然需要的话可以直接调用系统的camera程序,但自己实现会使用更自由. 呐,既然要用实现相机,那就需要先了解一下调用camera的类android.hardware.camera android.hardware.Camera The Camera class is used to set image captu

android 系统构架和应用程序目录结构分析

一.Android系统构架 Android系统从底向上一共分了4层,每一层都把底层实现封装,并暴露调用接口给上一层. Linux内核(Linux Kernel) Android运行在linux kernel 2.6之上,但是把linux内受GNU协议约束的部分做了取代,这样在Android的程序可以用于商业目的. Linux 内核是硬件和软件层之间的抽象层. 中间件 中间件包括两部分:核心库和运行时(libraries & Android runtime) 核心库包括,SurfaceManage

Android简单的编写一个txt阅读器(没有处理字符编码),适用于新手学习

本程序只是使用了一些基本的知识点编写了一个比较简单粗陋的txt文本阅读器,效率不高,只适合新手练习.所以大神勿喷. 其实想到编写这种程序源自本人之前喜欢看小说,而很多小说更新太慢,所以本人就只能找一个完本的.txt小说下载下来,有没有网络都可以看,当然现在不看那玩意了. 废话就不说了,程序中使用到的有4个类,5个xml文件,其中3个布局文件.String.xml.AndroidManifest.xml. 先看效果图吧(虽然很丑):     下面就上代码吧,本人都注释好了,由于本人技术还不行,注释

Android NDK:②第一个NDK程序(创建步骤&amp;一些问题)

Android NDK:②第一个NDK程序(创建步骤&一些问题) 本节内容是:演示搭建第一个NDK程序 Android NDK第一个NDK程序创建步骤一些问题 创建一个Android Project Java代码中声明native方法 创建Jni文件夹编写ccpp代码 为项目添加NDK支持 新建配置一个Builder 调用了native方法的地方加载库 好了把程序跑起来 总结 遇到的问题 1.创建一个Android Project 直接创建一个新的Android Application Proj

Android流媒体开发之路二:NDK开发Android端RTMP直播推流程序

NDK开发Android端RTMP直播推流程序 经过一番折腾,成功把RTMP直播推流代码,通过NDK交叉编译的方式,移植到了Android下,从而实现了Android端采集摄像头和麦克缝数据,然后进行h264视频编码和aac音频编码,并发送到RTMP服务器,从而实现Android摄像头直播.程序名为NdkRtmpEncoder,在这里把整个过程,和大体框架介绍一下,算是给需要的人引路. 开发思路 首先,为什么要用NDK来做,因为自己之前就已经实现过RTMP推流.RTMP播放.RTSP转码等等各种

iOS中如何实现准确的倒计时程序 &middot; 九十里

iOS中倒计时程序,考虑线程暂停场景. iOS App进入后台时,GCD线程也会跟着暂停.当程序进入前台后,GCD线程恢复.因而倒计时程序需要考虑这一点,通过加入时间的比对来实现. + (void)countDownWithLapseTime:(int)lapseTime andBlock:(void(^)(int timeLapse)) countDownBlock{ __block dispatch_source_t timer; NSTimeInterval timeInterval=la