package cn.mutils.app.queue;
import java.util.LinkedList;
import java.util.List;
import cn.mutils.app.event.ContextOwnerDispathcer;
@SuppressWarnings({"rawtypes", "UnusedParameters", "ConstantConditions"})
public class Queue extends ContextOwnerDispathcer implements IQueue, IQueueItemListener {
protected boolean mRunInBackground = true;
protected int mMaxRunningCount = 1;
protected List<IQueueItem<?>> mQueue;
protected List<IQueueItem<?>> mQueueToBe;
protected void updateRunState() {
boolean runningBackground = isRunningBackground();
if (runningBackground != mRunInBackground) {
mRunInBackground = runningBackground;
for (IQueueListener listener : getListeners(IQueueListener.class)) {
listener.onRunStateChanged(this);
}
}
}
@Override
public boolean isRunInBackground() {
return mRunInBackground;
}
protected boolean isRunningBackground() {
if (mQueue == null || mQueueToBe == null) {
return true;
}
for (IQueueItem<?> task : mQueue) {
if (!task.isRunInBackground()) {
return false;
}
}
for (IQueueItem<?> task : mQueueToBe) {
if (!task.isRunInBackground()) {
return false;
}
}
return true;
}
@Override
public int getMaxRunningCount() {
return mMaxRunningCount;
}
@Override
public void setMaxRunningCount(int maxRunningCount) {
mMaxRunningCount = maxRunningCount;
}
@Override
public void add(IQueueItem<?> task) {
if (task.isStopped()) {
return;
}
synchronized (this) {
if (mQueueToBe == null) {
mQueueToBe = new LinkedList<IQueueItem<?>>();
}
}
mQueueToBe.add(task);
task.addListener(this);
startOneItem();
}
protected void startOneItem() {
if (mQueue != null && mQueue.size() >= mMaxRunningCount) {
return;
}
if (mQueueToBe != null && mQueueToBe.size() == 0) {
return;
}
IQueueItem<?> task = mQueueToBe.remove(0);
synchronized (this) {
if (mQueue == null) {
mQueue = new LinkedList<IQueueItem<?>>();
}
}
mQueue.add(task);
task.setContext(mContext);
task.start();
}
@Override
public void clear() {
if (mQueue != null) {
for (IQueueItem<?> task : mQueue) {
task.removeListener(this);
task.stop();
}
mQueue.clear();
}
if (mQueueToBe != null) {
for (IQueueItem<?> task : mQueueToBe) {
task.removeListener(this);
task.stop();
}
mQueueToBe.clear();
}
}
@Override
public void onException(IQueueItem task, Exception e) {
}
@Override
public void onStart(IQueueItem task) {
if (mQueue == null) {
return;
}
if (!mQueue.contains(task)) {
return;
}
onItemStart(task);
updateRunState();
}
@Override
public void onStop(IQueueItem task) {
boolean isInQueueToBe = false;
boolean isInQueue = mQueue != null && mQueue.contains(task);
if (!isInQueue) {
isInQueueToBe = mQueueToBe != null && mQueueToBe.contains(task);
}
if (!isInQueue && !isInQueueToBe) {
return;
}
if (isInQueue) {
mQueue.remove(task);
} else {
mQueueToBe.remove(task);
}
onItemStop(task);
startOneItem();
updateRunState();
}
protected void onItemStart(IQueueItem<?> task) {
}
protected void onItemStop(IQueueItem<?> task) {
}
}