DownTimer.java 3.56 KB
package com.cnlive.gundam.user.util;

import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;

import java.lang.ref.WeakReference;

public class DownTimer {
    private long totalTime = -1;
    private long intervalTime = 0;
    private long remainTime;
    private long systemAddTotalTime;
    private static final int TIME = 1;
    private TimeListener listener;
    private long curReminTime;
    private boolean isPause = false;

    public DownTimer() {
        mHandler = new MyHandler(this);
    }

    private static class MyHandler extends Handler {
        WeakReference<DownTimer> mActivity;

        MyHandler(DownTimer activity) {
            mActivity = new WeakReference<>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            DownTimer theActivity = mActivity.get();
            switch (msg.what) {
                case TIME:
                    if (!theActivity.isPause)
                        theActivity.soloveTime();
                    break;
                case 2:
                    theActivity.isPause = true;
                    break;
                default:
                    break;
            }
        }
    }


    public void setIntervalTime(long intervalTime) {
        this.intervalTime = intervalTime;
    }

    public void setTotalTime(long totalTime) {
        this.totalTime = totalTime;
    }

    public long getIntervalTime() {
        return intervalTime;
    }

    public long getTotalTime() {
        return totalTime;
    }

    public void start() {
        if (totalTime <= 0 && intervalTime <= 0) {
            throw new RuntimeException("you must set the totalTime > 0 or intervalTime >0");
        }

        systemAddTotalTime = SystemClock.elapsedRealtime() + totalTime;

        if (null != mHandler)
            mHandler.sendEmptyMessage(TIME);
    }

    public void cancel() {
        if (mHandler != null) {
            mHandler.removeMessages(TIME);
        }
    }

    public void release(){
        if(mHandler != null){
            mHandler.removeMessages(0);
            mHandler.removeCallbacks(null);
            mHandler = null;
        }
    }

    public void pause() {
        if (mHandler != null) {
            mHandler.removeMessages(TIME);
            isPause = true;
            curReminTime = remainTime;
        }
    }

    public void resume() {
        if (isPause) {
            isPause = false;
            totalTime = curReminTime;
            start();
        }
    }

    private MyHandler mHandler;


    private void soloveTime() {
        remainTime = systemAddTotalTime - SystemClock.elapsedRealtime();
        if (remainTime <= 0) {
            if (listener != null) {
                listener.onFinish();
                cancel();
            }
        } else if (remainTime < intervalTime) {
            if (null != mHandler)
                mHandler.sendEmptyMessageDelayed(TIME, remainTime);
        } else {
            long curSystemTime = SystemClock.elapsedRealtime();
            if (listener != null) {
                listener.onInterval(remainTime);
            }

            long delay = curSystemTime + intervalTime - SystemClock.elapsedRealtime();

            while (delay < 0) delay += intervalTime;

            if (null != mHandler) {
                mHandler.sendEmptyMessageDelayed(TIME, delay);
            }
        }
    }

    public interface TimeListener {
        public void onFinish();

        public void onInterval(long remainTime);
    }

    public void setTimerLiener(TimeListener listener) {
        this.listener = listener;
    }

}