diff options
| author | Samuel Tardieu <sam@rfc1149.net> | 2013-05-25 15:30:11 +0200 |
|---|---|---|
| committer | Samuel Tardieu <sam@rfc1149.net> | 2013-05-25 15:30:11 +0200 |
| commit | 43a0f4dfd94e0b47a60ddddcf58561dccecbac17 (patch) | |
| tree | e63ce522ff4986b2ce00b2579d0c0b73bb1e5c92 /main/src/cgeo/geocaching/utils | |
| parent | da2451acb8169ae0380341f167f9f45fa1e92f7a (diff) | |
| download | cgeo-43a0f4dfd94e0b47a60ddddcf58561dccecbac17.zip cgeo-43a0f4dfd94e0b47a60ddddcf58561dccecbac17.tar.gz cgeo-43a0f4dfd94e0b47a60ddddcf58561dccecbac17.tar.bz2 | |
refactoring: make periodic handler use weak references
PeriodicHandler now uses weak references to keep a link to the looper
that requested it. This way, it will not prevent the source from being
garbage collected even though a delayed message may be queued in the
handler.
Also, at the next iteration, the periodic handler will notice that its
starter looper has been garbage collected and will stop itself if it has
not been already.
Diffstat (limited to 'main/src/cgeo/geocaching/utils')
| -rw-r--r-- | main/src/cgeo/geocaching/utils/PeriodicHandler.java | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/main/src/cgeo/geocaching/utils/PeriodicHandler.java b/main/src/cgeo/geocaching/utils/PeriodicHandler.java index 2759580..288bbb0 100644 --- a/main/src/cgeo/geocaching/utils/PeriodicHandler.java +++ b/main/src/cgeo/geocaching/utils/PeriodicHandler.java @@ -3,16 +3,26 @@ package cgeo.geocaching.utils; import android.os.Handler; import android.os.Message; +import java.lang.ref.WeakReference; + /** * A PeriodicHandler class helps with the implementation of a periodic * action embedded in a thread with a looper such as the UI thread. - * The act() method will be called periodically. The clock may drift - * as the implementation does not target real-time actions. + * The onPeriodic() method of the listener will be called periodically. + * The clock may drift as the implementation does not target real-time + * actions. * * The handler will be interrupted if the device goes to sleep. * + * The handler only keeps a weak reference to the listener. If the listener + * is garbage-collected without having stopped the timer, the handler will + * stop itself. */ -abstract public class PeriodicHandler extends Handler { +final public class PeriodicHandler extends Handler { + + public static interface PeriodicHandlerListener { + public void onPeriodic(); + } final static private int START = 0; final static private int STOP = 1; @@ -20,21 +30,19 @@ abstract public class PeriodicHandler extends Handler { final private long period; + final private WeakReference<PeriodicHandlerListener> listenerRef; + /** * Create a new PeriodicHandler object. * * @param period * The period in milliseconds. */ - protected PeriodicHandler(final long period) { + public PeriodicHandler(final long period, final PeriodicHandlerListener listener) { this.period = period; + listenerRef = new WeakReference<PeriodicHandlerListener>(listener); } - /** - * Subclasses of PeriodicHandler must implement this method. - */ - abstract public void act(); - @Override public void handleMessage(final Message msg) { switch (msg.what) { @@ -46,8 +54,11 @@ abstract public class PeriodicHandler extends Handler { removeMessages(ACT); break; case ACT: - sendEmptyMessageDelayed(ACT, period); - act(); + final PeriodicHandlerListener listener = listenerRef.get(); + if (listener != null) { + sendEmptyMessageDelayed(ACT, period); + listener.onPeriodic(); + } break; default: throw new UnsupportedOperationException(); |
