package com.gapp.gvoa.util;
import java.util.LinkedList;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import android.os.Message;
public class MsgCenter {
public final String tag = "MsgCenter";
public enum MsgType{
E_NETWORK,
E_RSSITEM_UPDATE
}
private static MsgCenter _instance=null;
private boolean isRun;
private BlockingQueue<Message> msgQueue = new LinkedBlockingQueue<Message>();
private LinkedList<GSubscriber> subScriberList = new LinkedList<GSubscriber>();
private Thread msgThread = null;
public interface GSubscriber {
public void onMessage(Message msg);
}
public static MsgCenter instance(){
synchronized(MsgCenter.class){
if(null==_instance) {
_instance= new MsgCenter();
_instance.init();
}
}
return _instance;
}
private void init(){
isRun = true;
msgThread = new Thread(new MessageRunnable());
msgThread.start();
}
public void stop() {
isRun = false;
try {
if(null!=msgThread){
msgThread.interrupt();
msgThread.join();
msgThread=null;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private class MessageRunnable implements Runnable {
public void run() {
while (isRun) {
try {
Message msg = msgQueue.take();
distributeMsg(msg);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
}
private void distributeMsg(Message msg) {
for (GSubscriber sub : subScriberList)
{
sub.onMessage(msg);
}
}
public void postMessage(Message msg) {
try {
msgQueue.put(msg);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void register(GSubscriber subscriber) {
subScriberList.add(subscriber);
}
public void unRegister(GSubscriber subscriber) {
subScriberList.remove(subscriber);
}
}