package com.datdo.mobilib.event; import java.lang.ref.WeakReference; import java.util.HashSet; import java.util.Set; /** * <pre> * A special abstract class of {@link MblEventListener}. This class is frequently used to create an anonymous listener. * {@link MblEventCenter} only keeps a {@link WeakReference} to listeners to prevent memory leak. * Therefore, if anonymous listener does not extend this class, it will be destroyed by GC. * Remember to unregister when listener is no longer needed by calling {@link #terminate()} * * Here is an sample usage of this class: * <code> * MblEventCenter.addListener(new MblStrongEventListener() { * {@literal @}Override * public void onEvent(Object sender, String name, Object... args) { * // handle the event * // ... * * if (listenerIsNoLongerNeeded) { * terminate(); * } * } * }, "event_name"); * </code> * </pre> */ public abstract class MblStrongEventListener implements MblEventListener { private static final Set<MblStrongEventListener> sAnonymousObservers = new HashSet<MblStrongEventListener>(); public MblStrongEventListener() { synchronized (sAnonymousObservers) { sAnonymousObservers.add(this); } } /** * <pre> * Remove this listener from {@link MblEventCenter} and make it ready to be destroyed by GC. * </pre> */ public void terminate() { MblEventCenter.removeListenerFromAllEvents(this); synchronized (sAnonymousObservers) { sAnonymousObservers.remove(this); } } }