use arrays for listeners (avoid allocating iterators)

This commit is contained in:
Hannes Janetzek 2014-01-17 15:09:50 +01:00
parent 828c6d9212
commit bfb86e0a57
2 changed files with 57 additions and 56 deletions
vtm/src/org/oscim/map

@ -58,8 +58,8 @@ public final class Layers extends AbstractList<Layer> {
if (layer instanceof UpdateListener)
mMap.bind((UpdateListener) layer);
//if (layer instanceof InputListener)
// mMap.bind((InputListener) layer);
if (layer instanceof InputListener)
mMap.bind((InputListener) layer);
mLayerList.add(index, layer);
mDirtyLayers = true;
@ -73,8 +73,8 @@ public final class Layers extends AbstractList<Layer> {
if (remove instanceof UpdateListener)
mMap.unbind((UpdateListener) remove);
//if (remove instanceof InputListener)
// mMap.unbind((InputListener) remove);
if (remove instanceof InputListener)
mMap.unbind((InputListener) remove);
return remove;
}
@ -90,8 +90,8 @@ public final class Layers extends AbstractList<Layer> {
// unbind replaced layer
if (remove instanceof UpdateListener)
mMap.unbind((UpdateListener) remove);
//if (remove instanceof InputListener)
// mMap.unbind((InputListener) remove);
if (remove instanceof InputListener)
mMap.unbind((InputListener) remove);
return remove;
}
@ -114,8 +114,6 @@ public final class Layers extends AbstractList<Layer> {
for (Layer o : mLayers)
o.onDetach();
// TODO need to clear lists here?
}
boolean handleGesture(Gesture g, MotionEvent e) {
@ -130,15 +128,6 @@ public final class Layers extends AbstractList<Layer> {
return false;
}
void handleMotionEvent(MotionEvent e) {
if (mDirtyLayers)
updateLayers();
for (Layer o : mLayers)
if (o instanceof InputListener)
((InputListener) o).onMotionEvent(e);
}
private synchronized void updateLayers() {
mLayers = new Layer[mLayerList.size()];
int numRenderLayers = 0;

@ -74,11 +74,13 @@ public abstract class Map {
private VectorTileLayer mBaseLayer;
private Set<InputListener> mInputListeners = new LinkedHashSet<InputListener>();
private Set<UpdateListener> mUpdateListeners = new LinkedHashSet<UpdateListener>();
private Set<InputListener> mInputListenerSet = new LinkedHashSet<InputListener>();
private InputListener[] mInputListeners;
private Set<UpdateListener> mUpdateListenerSet = new LinkedHashSet<UpdateListener>();
private UpdateListener[] mUpdateListeners;
public Map() {
mViewport = new Viewport(this);
mAnimator = new MapAnimator(this, mViewport);
@ -88,8 +90,6 @@ public abstract class Map {
mEventLayer = new MapEventLayer(this);
mLayers.add(0, mEventLayer);
//mGestureDetector = new GestureDetector(this, mLayers);
}
public MapEventLayer getEventLayer() {
@ -200,22 +200,6 @@ public abstract class Map {
mClearMap = true;
}
/**
* This function is run on main-loop before rendering a frame.
* Caution: Do not call directly!
*/
protected void updateLayers() {
boolean changed = false;
// get the current MapPosition
changed |= mViewport.getMapPosition(mMapPosition);
for (UpdateListener l : mUpdateListeners)
l.onMapUpdate(mMapPosition, changed, mClearMap);
mClearMap = false;
}
/**
* Set {@link MapPosition} of {@link Viewport} and trigger a redraw.
*/
@ -262,37 +246,65 @@ public abstract class Map {
return mAnimator;
}
/**
* Register InputListener
*/
public void bind(InputListener listener) {
mInputListeners.add(listener);
}
/**
* Unregister InputListener
*/
public void unbind(InputListener listener) {
mInputListeners.remove(listener);
}
/**
* Register UpdateListener
*/
public void bind(UpdateListener l) {
mUpdateListeners.add(l);
if (mUpdateListenerSet.add(l))
mUpdateListeners = null;
}
/**
* Unregister UpdateListener
*/
public void unbind(UpdateListener l) {
mUpdateListeners.remove(l);
if (mUpdateListenerSet.remove(l))
mUpdateListeners = null;
}
/**
* This function is run on main-loop before rendering a frame.
* Caution: Do not call directly!
*/
protected void updateLayers() {
boolean changed = false;
// get the current MapPosition
changed |= mViewport.getMapPosition(mMapPosition);
if (mUpdateListeners == null) {
mUpdateListeners = new UpdateListener[mUpdateListenerSet.size()];
mUpdateListenerSet.toArray(mUpdateListeners);
}
for (UpdateListener l : mUpdateListeners)
l.onMapUpdate(mMapPosition, changed, mClearMap);
mClearMap = false;
}
/**
* Register InputListener
*/
public void bind(InputListener listener) {
if (mInputListenerSet.add(listener))
mInputListeners = null;
}
/**
* Unregister InputListener
*/
public void unbind(InputListener listener) {
if (mInputListenerSet.remove(listener))
mInputListeners = null;
}
// TODO make protected
public void handleMotionEvent(MotionEvent e) {
mLayers.handleMotionEvent(e);
if (mInputListeners == null) {
mInputListeners = new InputListener[mInputListenerSet.size()];
mInputListenerSet.toArray(mInputListeners);
}
for (InputListener l : mInputListeners)
l.onMotionEvent(e);