Android 倒计时器


Android 中好像没有提供类似的工具可以使用,这里实现一个到计时器.提供两个回调接口

  1. interface OnCountDownListener 
  2.     void OnCountDownTimeout();                            // 倒计时完成  
  3.     void onCountDownIntervalReach(int last);              // 倒计时时间时间间隔到达、用于过程中需要刷新的部分,last为已经过去多少时间  

完整源码:

  1. package com.example.countdown; 
  2.  
  3. import java.lang.ref.WeakReference; 
  4.  
  5. import android.os.Handler; 
  6. import android.os.Message; 
  7.  
  8. public class CountDown { 
  9.      
  10.     private final static int TAG_COUNT_DOWN_INTERVAL_REACH = 0x100
  11.     private final static int TAG_COUNT_DOWN_TIMEOUT        = 0x101
  12.      
  13.     private int mTimeout; 
  14.     private int mInterval; 
  15.     private int mCount; 
  16.     private CountDownHandler    mHandler; 
  17.     private CountDownThread     mThread; 
  18.     private OnCountDownListener mListener; 
  19.     private boolean             mToQuit = false
  20.      
  21.     CountDown(int timeout, int interval){ 
  22.         mTimeout  = timeout; 
  23.         mInterval = interval <= 0 ? 10 : interval; 
  24.         mCount    = 0
  25.         mHandler  = new CountDownHandler(this); 
  26.     } 
  27.      
  28.     public void setOnCountDownListener(OnCountDownListener listener){ 
  29.         mListener = listener; 
  30.     } 
  31.      
  32.     public void start(){ 
  33.         mToQuit   = false
  34.         mCount    = 0
  35.         mThread   = new CountDownThread(); 
  36.         mThread.start(); 
  37.     } 
  38.      
  39.     public void stop(){ 
  40.         mToQuit   = true
  41.         if( mThread != null ) mThread.interrupt(); 
  42.     } 
  43.      
  44.     private static class CountDownHandler extends Handler 
  45.     { 
  46.         WeakReference<CountDown> mRef; 
  47.  
  48.         CountDownHandler(CountDown countdown){ 
  49.             mRef = new WeakReference<CountDown>(countdown); 
  50.         } 
  51.  
  52.         public void handleMessage(Message msg)   
  53.         {     
  54.             CountDown countDown = mRef.get(); 
  55.             switch (msg.what)   
  56.             {     
  57.             case TAG_COUNT_DOWN_INTERVAL_REACH: 
  58.                 if( countDown.mListener != null ) 
  59.                     countDown.mListener.onCountDownIntervalReach((Integer)msg.obj); 
  60.                 break
  61.             case TAG_COUNT_DOWN_TIMEOUT: 
  62.                 if( countDown.mListener != null ) 
  63.                     countDown.mListener.OnCountDownTimeout(); 
  64.                 break
  65.             default
  66.                 break
  67.             }     
  68.             super.handleMessage(msg);     
  69.         }     
  70.     } 
  71.      
  72.     private class CountDownThread extends Thread{ 
  73.         public void run() 
  74.         {     
  75.             while(  ! isInterrupted() ){ 
  76.                 try { 
  77.                     Thread.sleep(mInterval); 
  78.                     mCount++; 
  79.                      
  80.                     Message message = new Message();     
  81.                     if(  mCount * mInterval > mTimeout ){ 
  82.                         message.what = TAG_COUNT_DOWN_TIMEOUT; 
  83.                         mHandler.sendMessage(message); 
  84.                         break
  85.                     } 
  86.                      
  87.                     message.what = TAG_COUNT_DOWN_INTERVAL_REACH; 
  88.                     message.obj = mCount * mInterval; 
  89.                     mHandler.sendMessage(message); 
  90.                 } catch (InterruptedException e) { 
  91.                     e.printStackTrace(); 
  92.                     if( mToQuit ) break
  93.                 } 
  94.             } 
  95.         } 
  96.     } 
  97.      
  98.     interface OnCountDownListener{ 
  99.         void OnCountDownTimeout(); 
  100.         void onCountDownIntervalReach(int last); 
  101.     } 

相关内容