只爲我寫了Google Maps v2(Android)的類來組織一個移動/縮放操作的隊列。如果您知道在第一個動畫仍在運行時另一個動畫已啓動,則動畫將被取消。Java是這個類的線程安全
所以爲了避免這個問題,我寫了上課。它正在工作,但我想知道它是否安全?也許我錯過了什麼?提前致謝。
public class MapDecoratorQueue {
private List<MapDecorator> queue = new Vector<MapDecorator>();
private boolean isRunning = false;
public synchronized void add(MapDecorator md) {
if (isRunning) {
queue.add(md);
} else {
queue.clear();
queue.add(md);
next(0);
isRunning = true;
}
}
private void next(final int pos) {
if (queue.isEmpty()) {
isRunning = false;
} else {
MapDecorator decorator = queue.get(pos);
L.log(MapDecoratorQueue.class.getSimpleName(), "isMove: "
+ decorator.isMove() + " isZoom: " + decorator.isZoom());
if (decorator.isMove()) {
decorator.map.moveCamera(decorator.move);
}
if (decorator.isZoom()) {
decorator.map.animateCamera(decorator.zoom,
decorator.zoomDuration, new CancelableCallback() {
@Override
public void onFinish() {
queue.remove(pos);
next(pos);
}
@Override
public void onCancel() {
L.log(MapDecoratorQueue.class.getSimpleName(),
"cancelled");
queue.clear();
isRunning = false;
}
});
}
}
}
public static class MapDecorator {
private GoogleMap map = null;
private CameraUpdate move = null;
private CameraUpdate zoom = null;
private int zoomDuration = 0;
/**
* Для передвижения камеры и анимации
*
* @param move
* @param zoom
* @param zoomDuration
*/
public MapDecorator(GoogleMap map, CameraUpdate move,
CameraUpdate zoom, int zoomDuration) {
this.map = map;
this.move = move;
this.zoom = zoom;
this.zoomDuration = zoomDuration;
}
/**
* Только для передвижения камеры
*
* @param move
*/
public MapDecorator(GoogleMap map, CameraUpdate move) {
this(map, move, null, 0);
}
/**
* Только для зума камеры
*
* @param zoom
* @param zoomDuration
*/
public MapDecorator(GoogleMap map, CameraUpdate zoom, int zoomDuration) {
this(map, null, zoom, zoomDuration);
}
public boolean isMove() {
return map != null && move != null;
}
public boolean isZoom() {
return map != null & zoom != null && zoomDuration >= 0;
}
public CameraUpdate getMove() {
return move;
}
public CameraUpdate getZoom() {
return zoom;
}
public int getZoomDuration() {
return zoomDuration;
}
}
}
'Vector'是同步的。 – Alex
我會看看'decorator.map.animateCamera',因爲回調'CancelableCallback'調用'next'函數。由於它看起來是異步的,你可能在那裏遇到問題。 –
@MichaelLaffargue這是一個來自'google-play-services-lib'的方法。 [link](http://developer.android.com/reference/com/google/android/gms/maps/GoogleMap.html#animateCamera(com.google.android.gms.maps.CameraUpdate,int,com.google .android.gms.maps.GoogleMap.CancelableCallback)) – rocknow