30 * following calls are delayed by (approximately) the interval. |
30 * following calls are delayed by (approximately) the interval. |
31 * The interval can be changed at any time, which will cause |
31 * The interval can be changed at any time, which will cause |
32 * an immediate execution of the runnable again. |
32 * an immediate execution of the runnable again. |
33 */ |
33 */ |
34 public class TickHandler extends Handler { |
34 public class TickHandler extends Handler { |
35 private final Runnable callback; |
35 private final Runnable callback; |
36 private int messageId; |
36 private int messageId; |
37 private long interval; |
37 private long interval; |
38 private boolean running; |
38 private boolean running; |
39 |
39 |
40 public TickHandler(Looper looper, long interval, Runnable callback) { |
40 public TickHandler(Looper looper, long interval, Runnable callback) { |
41 super(looper); |
41 super(looper); |
42 this.callback = callback; |
42 this.callback = callback; |
43 this.interval = interval; |
43 this.interval = interval; |
44 } |
44 } |
45 |
45 |
46 public synchronized void stop() { |
46 public synchronized void stop() { |
47 messageId++; |
47 messageId++; |
48 running = false; |
48 running = false; |
49 } |
49 } |
50 |
50 |
51 public synchronized void start() { |
51 public synchronized void start() { |
52 messageId++; |
52 messageId++; |
53 sendMessage(obtainMessage(messageId)); |
53 sendMessage(obtainMessage(messageId)); |
54 running = true; |
54 running = true; |
55 } |
55 } |
56 |
56 |
57 public synchronized void setInterval(long interval) { |
57 public synchronized void setInterval(long interval) { |
58 this.interval = interval; |
58 this.interval = interval; |
59 if(running) { |
59 if(running) { |
60 start(); |
60 start(); |
61 } |
61 } |
62 } |
62 } |
63 |
63 |
64 @Override |
64 @Override |
65 public synchronized void handleMessage(Message msg) { |
65 public synchronized void handleMessage(Message msg) { |
66 if(msg.what == messageId) { |
66 if(msg.what == messageId) { |
67 callback.run(); |
67 callback.run(); |
68 } |
68 } |
69 if(msg.what == messageId) { |
69 if(msg.what == messageId) { |
70 sendMessageDelayed(obtainMessage(messageId), interval); |
70 sendMessageDelayed(obtainMessage(messageId), interval); |
71 } |
71 } |
72 } |
72 } |
73 } |
73 } |