Android 倒计时计时器CountDownTimer的使用

在Android开发中,有时需要使用倒计时功能,在Android系统中提供了一个倒计时的抽象类来辅助倒计时行为

public class CountDownTimeActivity extends Activity implements OnClickListener {
 
    TextView mTextView;
    Button mButton1;
    Button mButton2;
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
      
       setContentView(R.layout.countdown);
      
       mTextView = (TextView)findViewById(R.id.textView1);
       mButton1 = (Button)findViewById(R.id.button1);
       mButton2 = (Button)findViewById(R.id.button2);
       mButton1.setOnClickListener(this);
       mButton2.setOnClickListener(this);
    }
 
    CountDownTimer timer = new CountDownTimer(40000,1000) { //定义40秒,每一秒执行一次
      
       @Override
       public void onTick(long millisUntilFinished) {
           mTextView.setText("seconds remaining: " + millisUntilFinished / 1000);  
          //millisUntilFinished不是精确值,需要进行计算millisUntilFinished / 1000
       }
      
       @Override
       public void onFinish() {
           mTextView.setText("done!");
       }
    };
   
    @Override
    public void onClick(View v) {
       switch(v.getId()){
       case R.id.button1:
           timer.start();
           break;
       case R.id.button2:
           timer.cancel(); //取消后停止运行。下次还会重新开始,而不是接着开始
           break;
       }
      
    }
}

这个类有点缺陷,就是不能暂停后再次接着继续使用,为此,需要自定义一个类似的倒计时计时器

package android.os;

import android.util.Log;


public abstract class CountDownTimer {

    private final long mMillisInFuture;

    private final long mCountdownInterval;

    private long mStopTimeInFuture;

    private long millisUntilFinished = 0;
    
    private boolean isPause = false;

    public CountDownTimer(long millisInFuture, long countDownInterval) {
        mMillisInFuture = millisInFuture;
        mCountdownInterval = countDownInterval;
    }

 
    public final void cancel() {
        mHandler.removeMessages(MSG);
    }

    public final void pause()
    {
        cancel();
        isPause = true;
    }
    public synchronized final CountDownTimer start() {
        if (mMillisInFuture <= 0) {
            onFinish();
            return this;
        }
        mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture;
        if(isPause)
        {
            mStopTimeInFuture = mStopTimeInFuture - millisUntilFinished;
            isPause = false;
        }
        mHandler.sendMessage(mHandler.obtainMessage(MSG));
        return this;
    }



    public abstract void onTick(long millisUntilFinished);


    public abstract void onFinish();


    private static final int MSG = 1;



    private Handler mHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {

            synchronized (CountDownTimer.this) {
                final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();

                if (millisLeft <= 0) {
                    onFinish();
                    millisUntilFinished = 0;
                } else if (millisLeft < mCountdownInterval) {
                    sendMessageDelayed(obtainMessage(MSG), millisLeft);
                } else {
                    long lastTickStart = SystemClock.elapsedRealtime();
                    onTick(millisLeft);
                    millisUntilFinished = millisLeft;
                    long delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime();

                    while (delay < 0) delay += mCountdownInterval;

                    sendMessageDelayed(obtainMessage(MSG), delay);
                }
            }
        }
    };
}



try doing it!

你可能感兴趣的:(Android 倒计时计时器CountDownTimer的使用)