package ca.grocerygo.android.services.location;
import android.os.HandlerThread;
import android.os.PowerManager;
import android.util.Log;
/**
* HandlerThread that unlocks itself when its work is
* complete. Used in conjunction with a WakeLock to
* accomplish this end.
*/
public class WakefulThread extends HandlerThread {
private PowerManager.WakeLock lock = null;
/**
* Constructor
*
* @param lock Already-acquired WakeLock to be released when
* work done
* @param name Name to supply to HandlerThread
*/
WakefulThread(PowerManager.WakeLock lock, String name) {
super(name);
this.lock = lock;
}
/**
* Override this method if you want to do something before
* looping begins
*/
protected void onPreExecute() {
// no-op by default
}
/**
* Override this method if you want to do something before
* the WakeLock is released when the thread's work is done
* or if an unhandled exception is raised while the thread
* runs
*/
protected void onPostExecute() {
if (lock.isHeld()) {
lock.release();
}
if (!lock.isHeld()) {
onUnlocked();
}
}
/**
* Override this method if you want to do something when
* the WakeLock is fully unlocked (e.g., shut down a
* service)
*/
protected void onUnlocked() {
// no-op by default
}
@Override
protected void onLooperPrepared() {
try {
onPreExecute();
} catch (RuntimeException e) {
Log.e("WakefulThread", "Exception onLooperPrepared()", e);
onPostExecute();
throw (e);
}
}
@Override
public void run() {
try {
super.run();
} finally {
onPostExecute();
}
}
}