/* IntervalEventDispatcher.java Copyright (c) 2016 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.event; import android.content.Intent; import org.deviceconnect.android.message.DConnectMessageService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; public class IntervalEventDispatcher extends EventDispatcher { private ScheduledExecutorService mExecutorService = Executors.newSingleThreadScheduledExecutor(); private ScheduledFuture<?> mScheduledFuture; private int mFirstPeriodTime; private int mPeriodTime; private Event mEvent; private Intent mMessage; private final Object mLockObject = new Object(); public IntervalEventDispatcher(final DConnectMessageService service, final int firstPeriodTime, final int periodTime) { super(service); if (firstPeriodTime < 0) { throw new IllegalArgumentException("firstPeriodTime is negative."); } if (periodTime <= 0) { throw new IllegalArgumentException("periodTime is zero or negative."); } mFirstPeriodTime = firstPeriodTime; mPeriodTime = periodTime; } @Override public void sendEvent(final Event event, final Intent message) { synchronized (mLockObject) { mEvent = event; mMessage = message; } } @Override public void start() { if (mScheduledFuture != null) { throw new IllegalStateException("This IntervalEventDispatcher already started."); } mScheduledFuture = mExecutorService.scheduleAtFixedRate(mRunnable, mFirstPeriodTime, mPeriodTime,TimeUnit.MILLISECONDS); } @Override public void stop() { if (mScheduledFuture != null) { mScheduledFuture.cancel(true); mExecutorService.shutdown(); } } private Runnable mRunnable = new Runnable() { @Override public void run() { synchronized (mLockObject) { if (mEvent != null && mMessage != null) { sendEventInternal(mEvent, mMessage); } mEvent = null; mMessage = null; } } }; }