package net.rdrei.android.mediator; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import android.os.Message; public class DelayedMessageQueue { private final Map<String, LinkedList<Message>> mQueueMap; private final Map<String, Handler> mHandlerRegistry; public DelayedMessageQueue() { mQueueMap = new HashMap<String, LinkedList<Message>>(); mHandlerRegistry = new HashMap<String, DelayedMessageQueue.Handler>(); } public void send(final String key, final Message message) { final Handler handler = mHandlerRegistry.get(key); if (handler == null) { storeMessage(key, message); } else { dispatch(handler, message); } } /** * Simpler way of sending a message only containing the what field without * having to create it from scratch. * * @param key * @param what */ public void send(final String key, final int what) { final Message message = Message.obtain(null, what); send(key, message); } private void storeMessage(final String key, final Message message) { LinkedList<Message> queue = mQueueMap.get(key); if (queue == null) { queue = new LinkedList<Message>(); mQueueMap.put(key, queue); } queue.add(message); } public void setHandler(final String key, final Handler handler) { synchronized (this) { mHandlerRegistry.put(key, handler); final LinkedList<Message> delayedMessages = mQueueMap.get(key); if (delayedMessages == null) { return; } for (final Message message : delayedMessages) { dispatch(handler, message); message.recycle(); } // Instead of dequeuing, we can also remove the queue as a whole // because it's consumed and most likely not reused. mQueueMap.remove(key); } } public void removeHandler(final String key) { mHandlerRegistry.remove(key); } private void dispatch(final Handler handler, final Message message) { handler.handleMessage(message); } public static interface Handler { void handleMessage(final Message message); } }