一、使用api提供的类进行操作

Android提供了CountDownTimer来让我们进行倒计时,可以让我们很方便的进行倒计时的操作。使用方式也很简单,下面直接贴代码就好了:

package com.kale.duitanglib.time;

import com.kale.lib.activity.KaleBaseActivity;

import android.os.Bundle;
import android.os.CountDownTimer;
import android.util.Log; /**
* @author Jack Tony
* @brief 官方提供的CountDownTimer来实现
* 在activity退出后还会持续计时,所以结束时需要判断当前activity是否在前台
* @date 2015/4/26
*/
public class SimpleCountDownTimerActivity extends KaleBaseActivity { @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
startCountDownTime(6); } private void startCountDownTime(long time) {
/**
* 最简单的倒计时类,实现了官方的CountDownTimer类(没有特殊要求的话可以使用)
* 即使退出activity,倒计时还能进行,因为是创建了后台的线程。
* 有onTick,onFinsh、cancel和start方法
*/
CountDownTimer timer = new CountDownTimer(time * 1000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
//每隔countDownInterval秒会回调一次onTick()方法
Log.d(TAG, "onTick " + millisUntilFinished / 1000);
} @Override
public void onFinish() {
Log.d(TAG, "onFinish -- 倒计时结束");
}
};
timer.start();// 开始计时
//timer.cancel(); // 取消
}
}

需要注意的点就是如果你是需要从5秒开始倒计时,每隔一秒进行一次onTick回调,那么你在构造类的时候需要传入5*1000和1000.此外开始倒计时后会开启一个后台线程,这样即使是你的activity被关掉,倒计时还是会执行的,所以你需要防范这个问题。解决思路是在activitydestroy的时候cancel掉它。或者是在倒计时结束时要更新UI的时候进行ui元素是否可见(存在)的判断。

二、让我们自定义一个倒计时类吧

如果我们想进行更多的功能,比如暂停,回复等等就需要自定义一个倒计时类了,就像下面这样:

package com.kale.lib.time;

import android.os.Handler;
import android.os.Message; /**
* Jack Tony
* 自定义的倒计时类,没有用官方提供的CountDownTimer来实现
* 有暂停等方法,灵活性强。在activity退出后还会持续计时,所以结束时需要判断当前activity是否在前台
* @date 2015/4/24
*/ public abstract class AdvancedCountdownTimer { private final long mCountdownInterval; private long mTotalTime; private long mRemainTime;
/**
*
* @param millisInFuture
* 表示以毫秒为单位 倒计时的总数
*
* 例如 millisInFuture=1000 表示1秒
*
* @param countDownInterval
* 表示 间隔 多少微秒 调用一次 onTick 方法
*
* 例如: countDownInterval =1000 ; 表示每1000毫秒调用一次onTick()
*
*/
public AdvancedCountdownTimer(long millisInFuture, long countDownInterval) {
mTotalTime = millisInFuture;
mCountdownInterval = countDownInterval;
mRemainTime = millisInFuture;
} public final void seek(int value) {
synchronized (AdvancedCountdownTimer.this) {
mRemainTime = ((100 - value) * mTotalTime) / 100;
}
} public final void cancel() {
mHandler.removeMessages(MSG_RUN);
mHandler.removeMessages(MSG_PAUSE);
} public final void resume() {
mHandler.removeMessages(MSG_PAUSE);
mHandler.sendMessageAtFrontOfQueue(mHandler.obtainMessage(MSG_RUN));
} public final void pause() {
mHandler.removeMessages(MSG_RUN);
mHandler.sendMessageAtFrontOfQueue(mHandler.obtainMessage(MSG_PAUSE));
} public synchronized final AdvancedCountdownTimer start() {
if (mRemainTime <= 0) {
onFinish();
return this;
}
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_RUN),
mCountdownInterval);
return this;
} public abstract void onTick(long millisUntilFinished, int percent); public abstract void onFinish(); private static final int MSG_RUN = 1; private static final int MSG_PAUSE = 2; private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
synchronized (AdvancedCountdownTimer.this) {
if (msg.what == MSG_RUN) {
mRemainTime = mRemainTime - mCountdownInterval;
if (mRemainTime <= 0) {
onFinish();
} else if (mRemainTime < mCountdownInterval) {
sendMessageDelayed(obtainMessage(MSG_RUN), mRemainTime);
} else {
onTick(mRemainTime, new Long(100
* (mTotalTime - mRemainTime) / mTotalTime)
.intValue()); sendMessageDelayed(obtainMessage(MSG_RUN),
mCountdownInterval);
}
} else if (msg.what == MSG_PAUSE) {
}
}
}
}; }

用法和上面完全一样,直接看代码:

package com.kale.duitanglib.time;

import com.kale.lib.activity.KaleBaseActivity;

import android.os.Bundle;
import android.util.Log; /**
* @author Jack Tony
* @brief
* @date 2015/4/26
*/
public class AdvancedCountdownTimerActivity extends KaleBaseActivity{ @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 8秒倒计时
com.kale.lib.time.AdvancedCountdownTimer countdownTimer = new com.kale.lib.time.AdvancedCountdownTimer(8 * 1000, 1000) {
@Override
public void onTick(long millisUntilFinished, int percent) {
//每隔countDownInterval秒会回调一次onTick()方法
Log.d(TAG,"onTick " + millisUntilFinished / 1000);
} @Override
public void onFinish() {
// 倒计时结束
Log.d(TAG, "onFinish -- 倒计时结束");
}
};
countdownTimer.start();
}
}

用这个类的时候同样需要注意,界面是否被关闭的问题。如果你的界面关闭了,而倒计时仍旧在进行的话,这时再更新UI可能会出现问题。下面贴出一个activity的测试代码:

package com.kale.countdowntimer;

import com.kale.lib.activity.KaleBaseActivity;

import android.os.CountDownTimer;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; /**
* @author Jack Tony
* @date 2015/5/7
*/
public class MainActivity extends KaleBaseActivity { private Button normalCountDownTimeButton; private Button customCountDownTimeButton; private TextView timeTextView; @Override
protected int getContentViewId() {
return R.layout.activity_main;
} @Override
protected void findViews() {
normalCountDownTimeButton = getView(R.id.normalCountDownTime_button);
customCountDownTimeButton = getView(R.id.custom_CountDownTime_button);
timeTextView = getView(R.id.time_textView);
} @Override
protected void setViews() {
normalCountDownTimeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startNormalCountDownTime(5); }
});
customCountDownTimeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startCustomCountDownTime(5);
}
});
} private void startNormalCountDownTime(long time) {
/**
* 最简单的倒计时类,实现了官方的CountDownTimer类(没有特殊要求的话可以使用)
* 即使退出activity,倒计时还能进行,因为是创建了后台的线程。
* 有onTick,onFinsh、cancel和start方法
*/
CountDownTimer timer = new CountDownTimer(time * 1000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
Log.d(TAG, "onTick " + millisUntilFinished / 1000);
timeTextView.setText("还剩" + millisUntilFinished / 1000 + "秒");
} @Override
public void onFinish() {
Log.d(TAG, "onFinish -- 倒计时结束");
timeTextView.setText("结束");
}
};
timer.start();
//timer.cancel();
} private void startCustomCountDownTime(long time) {
com.kale.lib.time.AdvancedCountdownTimer countdownTimer = new com.kale.lib.time.AdvancedCountdownTimer(time * 1000, 1000) {
@Override
public void onTick(long millisUntilFinished, int percent) {
Log.d(TAG, "onTick " + millisUntilFinished / 1000);
timeTextView.setText("还剩" + millisUntilFinished / 1000 + "秒");
} @Override
public void onFinish() {
Log.d(TAG, "onFinish -- 倒计时结束");
timeTextView.setText("结束");
}
};
countdownTimer.start();
} }

源码下载:http://download.csdn.net/detail/shark0017/8671631

Android中方便好用的倒计时类的更多相关文章

  1. android中与SQLite数据库相关的类

    为什么要在应用程序中使用数据库?数据库最主要的用途就是作为数据的存储容器,另外,由于可以很方便的将应用程序中的数据结构(比如C语言中的结构体)转化成数据库的表,这样我们就可以通过操作数据库来替代写一堆 ...

  2. Android中内容观察者的使用---- ContentObserver类详解 (转)

    前言: 工作中,需要开启一个线程大量的查询某个数据库值发送了变化,导致的开销很大,后来在老大的指点下,利用了 ContentObserver完美的解决了该问题,感到很兴奋,做完之后自己也对Conten ...

  3. Android中蓝牙的基本使用----BluetoothAdapter类简介

    天气逐渐热了,自己也越来越懒了,虽然看着了很多东西,解决了很多问题,有些收获却不想写着.主要有一下两方面原因: 第一.以前写的一些关于Android知识的Blog,都是在学习过程中发现网络上没有相关知 ...

  4. Android中内容观察者的使用---- ContentObserver类详解

    详解:http://blog.csdn.net/qinjuning/article/details/7047607

  5. [转]Android中Application类的用法

    原文链接:http://www.cnblogs.com/renqingping/archive/2012/10/24/Application.html Application类 Application ...

  6. 【转】Android中Application类用法

    转自:http://www.cnblogs.com/renqingping/archive/2012/10/24/Application.html Application类 Application和A ...

  7. Android(java)学习笔记120:Android中的Application类用法

    1.简介 如果想在整个应用中使用全局变量,在java中一般是使用静态变量,public类型:而在android中如果使用这样的全局变量就不符合Android的框架架构,但是可以使用一种更优雅的方式就是 ...

  8. Android中Application类用法

    Application类 Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个Application对象,用来存储系 ...

  9. Android(java)学习笔记61:Android中的 Application类用法

    1. 简介 如果想在整个应用中使用全局变量,在java中一般是使用静态变量,public类型:而在android中如果使用这样的全局变量就不符合Android的框架架构,但是可以使用一种更优雅的方式就 ...

随机推荐

  1. 页面头部title、description、keywords标签的优化

    页面头部优化<Head></Head>中间的区域中间的区域,我们称为网页的头部.在网页的头部中,通常存放一些介绍页面内容的信息,例如页面标题.描述及关键字等等.在头部优化中,除 ...

  2. 【转载】 IE/Firefox每次刷新时自动检查网页更新,无需手动清空缓存的设置方法

    [参考了别人的文章]我们做技术,经常在写页面的时候需要多次刷新测试,可是浏览器都有自己的 缓存机制,一般CSS和图片都会被缓存在本地,这样我们修改的CSS就看不到效果 了,每次都去清空缓存,再刷新看效 ...

  3. Flex知识备忘

    div被flex遮挡 //如果设置z-index无效,那么设置flex加载参数 params.wmode = "Opaque";

  4. [作业向]tinyhttp web服务器设计及完整代码

    最近看了<HTTP权威指南>和<UNP>有了写一个简单的web服务器的想法,正好这个学期没有什么课,所以就花了一个星期这样写了一个出来,鉴于本人水平有限,如果有什么设计或代码错 ...

  5. (转载)Linux 套接字编程中的 5 个隐患

    在 4.2 BSD UNIX® 操作系统中首次引入,Sockets API 现在是任何操作系统的标准特性.事实上,很难找到一种不支持 Sockets API 的现代语言.该 API 相当简单,但新的开 ...

  6. Java hashCode() 和 equals()的若干问题解答

    本章的内容主要解决下面几个问题: 1 equals() 的作用是什么? 2 equals() 与 == 的区别是什么? 3 hashCode() 的作用是什么? 4 hashCode() 和 equa ...

  7. [SLAM] 01 "Simultaneous Localization and Mapping" basic knowledge

    发信人: leecty (Terry), 信区: ParttimeJobPost标 题: 创业公司招SLAM 算法工程师发信站: 水木社区 (Thu Jun 16 19:18:24 2016), 站内 ...

  8. [Python] Interpreter setting in Pycharm

    From: http://blog.csdn.net/u013088062/article/details/50135135 From: http://blog.csdn.net/u013088062 ...

  9. Ink – 帮助你快速创建响应式邮件(Email)的框架

    Ink 可以帮助你快速创建响应的 HTML 电子邮件,可工作在任何设备和客户端.这个 CSS 框架帮助您构建可在任何设备上阅读的 HTML 电子邮件.曾经需要你兼顾各种邮件客户端的日子一去不复返了,I ...

  10. 测试Flask应用_学习笔记

    源代码尽在我的github上面:https://github.com/521xueweihan 欢迎大家交流学习 """ setUp() 方法中会创建一个新的测试客户端并 ...