org.oscim.layers.tile.JobQueue Maven / Gradle / Ivy
/*
* Copyright 2012, 2013 Hannes Janetzek
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see .
*/
package org.oscim.layers.tile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static org.oscim.layers.tile.MapTile.State.CANCEL;
import static org.oscim.layers.tile.MapTile.State.LOADING;
import static org.oscim.layers.tile.MapTile.State.NONE;
/**
* A JobQueue keeps the list of pending jobs for a MapView and prioritizes them.
*/
public class JobQueue {
static final Logger log = LoggerFactory.getLogger(JobQueue.class);
private int mCurrentJob = 0;
private MapTile[] mJobs;
/**
* @param tiles the jobs to be added to this queue.
*/
public synchronized void setJobs(MapTile[] tiles) {
mJobs = tiles;
mCurrentJob = 0;
}
/**
* Removes all jobs from this queue.
*/
public synchronized void clear() {
if (mJobs == null) {
mCurrentJob = 0;
return;
}
MapTile[] tiles = mJobs;
for (int i = mCurrentJob, n = mJobs.length; i < n; i++) {
MapTile t = tiles[i];
if (t.state(LOADING | CANCEL)) {
t.setState(NONE);
} else {
log.error("Wrong tile in queue {} {}", t, t.state());
}
tiles[i] = null;
}
mCurrentJob = 0;
mJobs = null;
}
/**
* @return true if this queue contains no jobs, false otherwise.
*/
public synchronized boolean isEmpty() {
return (mJobs == null);
}
/**
* @return the most important job from this queue or null, if empty.
*/
public synchronized MapTile poll() {
if (mJobs == null)
return null;
if (mCurrentJob == 0) {
int len = mJobs.length;
if (len > 1)
TileDistanceSort.sort(mJobs, 0, len);
}
MapTile t = mJobs[mCurrentJob];
mJobs[mCurrentJob] = null;
if (++mCurrentJob == mJobs.length)
mJobs = null;
return t;
}
}