Android倒计时功能实现
2015-07-08 16:25
344 查看
- 介绍
在Android开发中倒计时功能还是比较常见的,实现方式网上有人有总结过,大概有Timer、Handler、Thread + Handler等实现方式,下面是我使用Thread + Handler方式实现的倒计时功能,开启新的线程可以减少主线程的阻塞。
- 代码实现
代码的思路大致是当需要一次的新的倒计时时。先把上一个线程停止掉,并把MessageQueue中消息清空,然后再新建一个线程开始新的计时操作,这个工具类一般是放置在Activity或者Fragment中使用,一般也会操作资源文件,所以需要在Activity或者Fragment中的onDestroy()方法中调用cancel方法及时更换一个Handler空壳,不然会引起崩溃。代码只提供一种思路,还有很多可以优化的地方。
在Android开发中倒计时功能还是比较常见的,实现方式网上有人有总结过,大概有Timer、Handler、Thread + Handler等实现方式,下面是我使用Thread + Handler方式实现的倒计时功能,开启新的线程可以减少主线程的阻塞。
- 代码实现
public class CountTimer { private int mCount; private int mCountdownInterval; private static final int WHAT = 0; private CountThread mThread; public interface OnCountDownListener { void onCountDown(int count); } private Handler mHandler; private Context mContext; public CountTimer(Context mContext, final OnCountDownListener mListener) { this.mContext = mContext; mHandler = new Handler(mContext.getMainLooper()) { @Override public void handleMessage(Message msg) { if (msg.what == WHAT) { int arg1 = msg.arg1; if (mListener != null) { mListener.onCountDown(arg1); } } } }; } /** * 开始倒计时 * @param count 总次数 * @param countDownInterval 每次倒计时的间隔(毫秒为单位) */ public void start(int count, int countDownInterval) { this.mCount = count; this.mCountdownInterval = countDownInterval; if (mThread != null && mThread.isAlive()) { // 结束线程,清空MessageQueue mThread.setReadyStop(true); } else { mHandler.removeMessages(WHAT); mThread = new CountThread(); mThread.start(); } } /** * 取消计时操作 */ public void cancel() { mHandler = new Handler(mContext.getMainLooper()); } private class CountThread extends Thread { private boolean isReadyStop; public void setReadyStop(boolean isReadyStop) { this.isReadyStop = isReadyStop; } @Override public void run() { for (int i = mCount; i >= 1; i--) { if (isReadyStop) { mHandler.removeMessages(WHAT); mThread = new CountThread(); mThread.start(); return; } Message msg = Message.obtain(); msg.what = WHAT; msg.arg1 = i; mHandler.sendMessage(msg); try { Thread.sleep(mCountdownInterval); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
代码的思路大致是当需要一次的新的倒计时时。先把上一个线程停止掉,并把MessageQueue中消息清空,然后再新建一个线程开始新的计时操作,这个工具类一般是放置在Activity或者Fragment中使用,一般也会操作资源文件,所以需要在Activity或者Fragment中的onDestroy()方法中调用cancel方法及时更换一个Handler空壳,不然会引起崩溃。代码只提供一种思路,还有很多可以优化的地方。
相关文章推荐
- android安卓开发基础小笔记,添加按钮事件,打开新窗体,窗体传值,回传
- android.os.TransactionTooLargeException
- [Android] 判断手机上是否安装了某个程序
- Android Fragment 真正的完全解析(上)
- J哥---------Android shape属性详细整理
- Android 控制ScrollView滚动到底部或顶部
- android EditText如何使光标随着输入内容移动
- android事件分发上
- java.lang.Class Cast Exception: android.widget.HeaderViewListAdapter
- Android 动态加载框架的研究(一)
- android打开网页
- android事件分发下
- 抓取Android应用的log
- Android学习笔记(2)--基本编译流程 & 添加定制产品
- Android多线程下安全访问数据库
- 使用Kotlin开发Android应用(III):扩展函数和默认值
- Android淡入淡出欢迎界面
- 解决通过Intent调用系统拍照程序,返回图片太小的问题[android]
- Android的BUG(三) - 广为人知的诟病:频繁重启问题
- android--manifest中的largeHeap是干什么用的?