package com.openvehicles.OVMS.api; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; import android.os.Handler; import android.os.Message; import com.openvehicles.OVMS.entities.CarData; public class ApiObservable { private static ApiObservable sInstance; private final List<ApiObserver> mObservers = new ArrayList<ApiObserver>(); private final NotifyOneHandler mHandler; public static ApiObservable get() { if (sInstance == null) { sInstance = new ApiObservable(); } return sInstance; } public ApiObservable() { mHandler = new NotifyOneHandler(this); } public void addObserver(ApiObserver pObserver) { if (pObserver == null) { throw new NullPointerException(); } synchronized (this) { if (!mObservers.contains(pObserver)) mObservers.add(pObserver); } } public int countObservers() { return mObservers.size(); } public synchronized void deleteObserver(ApiObserver pObserver) { mObservers.remove(pObserver); } public synchronized void deleteObservers() { mObservers.clear(); } public void notifyOnBind(ApiService pService) { int size = 0; ApiObserver[] arrays = null; synchronized (this) { size = mObservers.size(); arrays = new ApiObserver[size]; mObservers.toArray(arrays); } if (arrays != null) { for (ApiObserver observer : arrays) { observer.onServiceAvailable(pService); } } } public void notifyUpdate(CarData pCarData) { mHandler.notifyeUpdate(pCarData); } private void notifyeOneUpdate(CarData pCarData) { int size = 0; ApiObserver[] arrays = null; synchronized (this) { size = mObservers.size(); arrays = new ApiObserver[size]; mObservers.toArray(arrays); } if (arrays != null) { for (ApiObserver observer : arrays) { observer.update(pCarData); } } } private static class NotifyOneHandler extends Handler { private static final int WHAT = 100; private final WeakReference<ApiObservable> mParent; public NotifyOneHandler(ApiObservable pParent) { mParent = new WeakReference<ApiObservable>(pParent); } public void notifyeUpdate(CarData pCarData) { Message msg = new Message(); msg.what = WHAT; msg.obj = pCarData; removeMessages(WHAT, pCarData); sendMessageDelayed(msg, 300); } @Override public void handleMessage(Message msg) { mParent.get().notifyeOneUpdate((CarData) msg.obj); } } }