Skip to content

Instantly share code, notes, and snippets.

@caseykulm
Created June 2, 2017 15:29
Show Gist options
  • Save caseykulm/132b5db2cbca003e95ee9c02a177dea0 to your computer and use it in GitHub Desktop.
Save caseykulm/132b5db2cbca003e95ee9c02a177dea0 to your computer and use it in GitHub Desktop.
Serial Delay Util
public class SerialDelayUtil {
private final SerialDelayHandler serialDelayHandler;
public SerialDelayUtil() {
this.serialDelayHandler = new SerialDelayHandler(Looper.getMainLooper());
}
/**
* <p>
* Runs the runnable after millisDelay, but every time this function is called
* all previous calls that are still enqueued will be cancelled and the current
* call will be enqueued.
* </p>
* <p>
* Example 1:<br/>
* <code><br/>
* serialDelayUtil.postDelayed(runnable1, 5000);<br/>
* serialDelayUtil.postDelayed(runnable2, 5000);<br/>
* serialDelayUtil.postDelayed(runnable3, 5000);<br/>
* </code><br/>
* In this example only runnable3 will be run
* </p>
* <p>
* Example 2:<br/>
* <code><br/>
* serialDelayUtil.postDelayed(runnable1, 5000);<br/>
* Thread.sleep(6000);<br/>
* serialDelayUtil.postDelayed(runnable2, 5000);<br/>
* </code><br/>
* In this example both runnable1 and runnable2 will be run
* </p>
* <p>
* Note: The runnable will always be run on the {@link Looper#getMainLooper()}
* </p>
*
* @param runnable Runnable to perform after delay
* @param millisDelay Milliseconds to wait before calling run on runnable
*/
public void postDelayed(Runnable runnable, int millisDelay) {
serialDelayHandler.removeMessages(SerialDelayHandler.MSG_RUN_TASK);
serialDelayHandler.sendMessageDelayed(serialDelayHandler.obtainMessage(SerialDelayHandler.MSG_RUN_TASK, runnable), millisDelay);
}
private static class SerialDelayHandler extends Handler {
private static final int MSG_RUN_TASK = 1;
private SerialDelayHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_RUN_TASK: {
Runnable runnable = (Runnable) msg.obj;
runnable.run();
break;
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment