DownTimer.java
3.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
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 {
void onFinish();
void onInterval(long remainTime);
}
public void setTimerLiener(TimeListener listener) {
this.listener = listener;
}
}