//package com.postpc.easyrider.utils;
class CountingThread extends Thread {
private int _initialCount;
private int _millisBetweenCount;
private CountingListener _listener;
private boolean _stopCounting = false;
private boolean _hardAbort = false;
/**
* Initializes a counting thread.
*
* @param listener a counting listener for the thread.
* @param initialCount the initial counter of the thread.
* @param millisBetweenCount milliseconds between counter subtraction.
*/
public CountingThread(CountingListener listener, int initialCount, int millisBetweenCount) {
_listener = listener;
_initialCount = initialCount;
_millisBetweenCount = millisBetweenCount;
}
@Override
public void run() {
int counter = _initialCount;
_listener.onCountBegin(counter);
while (!_stopCounting && counter > 0) {
try {
Thread.sleep(_millisBetweenCount);
} catch (InterruptedException e) {
// someone wants us out
_listener.onCountAborted(counter);
return;
}
counter--;
_listener.onCount(counter);
}
if (_stopCounting) {
if (!_hardAbort) {
_listener.onCountAborted(counter);
}
} else {
_listener.onCountComplete();
}
}
/**
* Aborts the counting thread and calls the onCountAborted listener.
*/
public void abort() {
_stopCounting = true;
this.interrupt();
}
/**
* Aborts the counting thread and doesn't call onCountAborted().
*/
public void hardAbort() {
_hardAbort = true;
abort();
}
}
interface CountingListener {
/**
* Fires when counting is starting.
*
* @param counter current value of the counter.
*/
public void onCountBegin(int counter);
/**
* Fires when counting is being decreased.
*
* @param counter current value of the counter.
*/
public void onCount(int counter);
/**
* Fires when the counting is complete.
*/
public void onCountComplete();
/**
* Fires if counting has been aborted.
*
* @param counter the counter value while aborting.
*/
public void onCountAborted(int counter);
}