package com.itap.voiceemoticon.activity; import java.lang.ref.WeakReference; import java.util.ArrayList; import android.os.Handler; import android.os.Looper; /** * * * * @author * */ public class NotificationCenter { private static final Handler sHandler = new Handler(Looper.getMainLooper()); public static final int MAX_COUNT = 100; private static ArrayList<WeakReference<INotify>>[] mArray; static { mArray = new ArrayList[MAX_COUNT]; for (int i = 0; i < MAX_COUNT - 1; i++) { mArray[i] = new ArrayList<WeakReference<INotify>>(); } } private static NotificationCenter mInstance = null; private NotificationCenter() { } public static NotificationCenter getInstance() { if (mInstance == null) { mInstance = new NotificationCenter(); } return mInstance; } public void register(INotify notify, int notificationID) { mArray[notificationID].add(new WeakReference<INotify>(notify)); } public void unregister(INotify notify, int notificationID) { final int size = mArray[notificationID].size(); INotify arrayMember; for (int i = 0; i < size; i++) { WeakReference<INotify> weakObject = mArray[notificationID].get(i); arrayMember = weakObject.get(); if (arrayMember != null && arrayMember == notify) { mArray[notificationID].remove(weakObject); return; } } } private ArrayList<WeakReference<INotify>> mTempUseArray = new ArrayList<WeakReference<INotify>>(); public void notify(Notification notification) { notifyInUIThread(notification); } private void notifyInUIThread(final Notification notification) { sHandler.post(new Runnable() { @Override public void run() { INotify notify; for (int i=0; i<mArray[notification.id].size(); ++i) { WeakReference<INotify> weakObject = mArray[notification.id].get(i); notify = weakObject.get(); if (notify != null) { notify.notify(notification); } else { mTempUseArray.add(weakObject); } } for (int i=0; i<mTempUseArray.size(); ++i) { mArray[notification.id].remove(mTempUseArray.get(i)); } mTempUseArray.clear(); } }); } public static Notification obtain(int id, Object extObj) { return new Notification(id, extObj); } public static Notification obtain(int id) { return new Notification(id); } }