我正在开发一款安卓应用程序,需要每分钟从其他设备接收GPS位置,并在地图上显示它们。
我正在使用GoogleMaps API V2。
我想做的是,每当接收到新的位置时就刷新位置标记。(我不想刷新整个地图)
目前,我在菜单中添加了一个按钮,可以使我刷新整个地图。
具体结构如下:我有一个运行MQTT的服务,每次接收到位置后,我将其添加到HashMap中,这个HashMap表示我的地图数据源。这个HashMap是一个扩展Observable的Singleton。此外,我的Fragment会实现Observer。
以下是我的Fragment代码(实现Observer):
您好,以下是您需要翻译的内容:
然而,在这种情况下,myGoogleMap变量始终为空,因此标记永远不会添加到Google地图上。
有人知道为什么这个变量为空吗?
我想做的是,每当接收到新的位置时就刷新位置标记。(我不想刷新整个地图)
目前,我在菜单中添加了一个按钮,可以使我刷新整个地图。
具体结构如下:我有一个运行MQTT的服务,每次接收到位置后,我将其添加到HashMap中,这个HashMap表示我的地图数据源。这个HashMap是一个扩展Observable的Singleton。此外,我的Fragment会实现Observer。
以下是我的Fragment代码(实现Observer):
public void update(Observable observable, final Object object)
{
if (observable instanceof ListPositions && object != null)
{
Position p = (Position) object;
LatLng position = new LatLng(p.getLatitude(), p.getLongitude());
// Where i'd like to move the markers
}
else
{
// Where i'd like to remove the marker from the map
}
}
从我的单例位置列表中获取代码
public class ListPositions extends Observable{
private HashMap<String,Position> mapPosition;
private ListPositions()
{
mapPosition = new HashMap<String, Position>();
VehicleMapFragment mapFragmentObserver = new VehicleMapFragment();
this.addObserver(mapFragmentObserver);
}
private static ListPositions INSTANCE = null;
public static synchronized ListPositions getInstance()
{
if (INSTANCE == null)
{ INSTANCE = new ListPositions();
}
return INSTANCE;
}
public int getNumberOfPosition()
{
return mapPosition.size();
}
public void addPosition(String key, Position p){
mapPosition.put(key,p);
setChanged();
notifyObservers(p);
}
public void removePosition(String key){
mapPosition.remove(key);
setChanged();
notifyObservers();
}
来自我的服务的运行MQTT的代码
public void onPositionMessageReceived(MqttMessage message, String source)
{
Gson gson = new Gson();
String s = gson.toJson(message.toString());
String jsonPosition = gson.toJson(message.toString());
jsonPosition = formatMessage(jsonPosition);
Position p = gson.fromJson(jsonPosition, Position.class);
ListPositions.getInstance().addPosition(source, p);
}
您好,以下是您需要翻译的内容:
在我的Observer Fragment的更新函数中,有没有人知道如何单独移动每个标记,而无需刷新整个地图?可以使用Handler从另一个线程更新地图来修改主UI线程吗?
非常感谢
编辑:
因为AniV给出的第一种方法对我不起作用,所以我尝试使用Asyntask,在观察者收到可观察列表的通知时运行。
观察者Fragment的代码:
public void update(Observable observable, final Object object)
{
if (observable instanceof ListPositions && object != null)
{
Position p = (Position) object;
position = new LatLng(p.getLatitude(), p.getLongitude());
options = new MarkerOptions().position(position).title("TEST").snippet("TEST");
PositionUpdate positionUpdaterTask = new PositionUpdate(myGoogleMap, options, position);
positionUpdaterTask.execute();
}
}
来自AsyncTask的代码:
public class PositionUpdate extends AsyncTask<Void, Void, Void>{
private GoogleMap myGoogleMap;
private MarkerOptions options;
private LatLng positionToAdd;
public PositionUpdate(GoogleMap googleMap, MarkerOptions options, LatLng position)
{
this.myGoogleMap = googleMap;
this.options = options;
this.positionToAdd = position;
}
@Override
protected Void doInBackground(Void...voids)
{
return null;
}
@Override
protected void onPostExecute(Void aVoid)
{
if (myGoogleMap != null)
{
myGoogleMap.addMarker(options.position(positionToAdd));
Log.i(ConstElisa.LOG_ELISA, "MARKER ADDED");
}
else
{
Log.e(ConstElisa.LOG_ELISA, "ERROR ADDING THE MARKER");
}
super.onPostExecute(aVoid);
}
然而,在这种情况下,myGoogleMap变量始终为空,因此标记永远不会添加到Google地图上。
有人知道为什么这个变量为空吗?