package com.superliminal.util.android;
import android.app.Activity;
/**
* Meant for code that must run at some frequency while an Activity is running.
* Call onPause and onResume methods in your corresponding activity methods.
*
* @author Melinda Green
*/
public class ActivityHeartbeat {
private Activity activity;
private Thread heart = null;
private Runnable beat;
private long frequencyMilliseconds;
/**
* The given code will be run at the given frequency while the given Activity is active.
* It is always called on the UI thread.
*
* @param activity Activity associated with this heartbeat.
* @param frequencyMilliseconds How often to beat.
* @param onBeat Caller's code to be executed once per heartbeat.
*/
public ActivityHeartbeat(Activity activity, int frequencyMilliseconds, Runnable onBeat) {
this.activity = activity;
this.frequencyMilliseconds = frequencyMilliseconds;
this.beat = onBeat;
}
/**
* Always call this method for each of your ActivityHeartbeat objects
* each time your onPause method is invoked. This stops all beats for this
* ActivityHeartbeat until onResume restarts it.
*/
public void onPause() {
heart = null; // Gracefully stops the thread.
}
/**
* Always call this method for each of your ActivityHeartbeat objects
* each time your onResume method is invoked. This restarts this
* ActivityHeartbeat until onPause stops it.
*/
public void onResume() {
heart = new Thread("Heartbeat") {
@Override
public void run() {
while(heart != null) {
activity.runOnUiThread(beat);
try {
sleep(frequencyMilliseconds);
} catch(InterruptedException e) {}
}
}
};
heart.setPriority(Thread.MIN_PRIORITY);
heart.start();
}
}