android - 刷新许多谷歌地图标记位置,而无需在 Android 中刷新整个 map

标签 android google-maps position refresh markers

我目前正在开发一款 Android 应用程序,它必须每分钟从其他设备接收 GPS 位置,并将其显示在 map 上。 我正在使用 GoogleMaps Api V2,

我想做的是在收到新位置时立即刷新位置标记。 (我不想刷新整个 map )

目前,我在菜单中添加了一个按钮,使我能够刷新整个 map 。

详细到结构,我有一个运行 MQTT 的服务,每次收到一个位置时,我都会将它添加到一个 Hashmap 中,它代表我的 map 数据源。 这个 HashMap 是一个扩展了 Observable 的 Singleton。 此外,我的 fragment 显示了我的工具 Observer。

来自实现 Observer 的 Fragment 的代码

 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
     }
 }

代码来 self 的位置单例列表

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 的 myService 的代码

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 的更新功能中单独移动每个标记而不刷新整个 map 吗? 我可以使用处理程序更新 map ,从其他线程修改主 UI 线程吗?

非常感谢

编辑:

因为 AniV 给出的第一个方法对我不起作用,所以我尝试了一个 Asyntask,它在我的观察者从 Observable List 收到通知时运行。

来自观察者 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 变量始终为 null,因此永远不会将标记添加到 Google map 。

有人知道为什么这个变量为空吗?

最佳答案

我终于通过使用 AsyncTask 成功地完成了那件事。

在我的编辑中,我说过我的 Google map 对象的空实例有一些问题。 这是由我的 Singleton Observable 引起的。事实上,在构造函数中,我使用了

VehicleMapFragment mapFragmentObserver = new VehicleMapFragment();
this.addObserver(mapFragmentObserver); 

此代码示例重新创建了我的 Fragment 的另一个实例,这就是 ii 具有 Null 对象的原因。

为了纠正这个问题,我简单地使用了:

ListPositions.getInstance().addObserver(this);

在我的 Fragment Observer 中。

所以如果你想在不刷新整个 map 的情况下更新标记位置, 您可以使用 Observer/Observable 模式,并使用 Asynctask 来更新标记位置。

关于android - 刷新许多谷歌地图标记位置,而无需在 Android 中刷新整个 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28914182/

相关文章:

jquery - 如何使 Colorbox iframe 随着向上/向下滚动而移动?

javascript - 如何使用 javascript 或 jQuery 动态更改 Bootstrap 5 下拉菜单的偏移量?

android - 在进行特定 Activity 时让 Android 屏幕永远不会变暗?

java - 在不下载所有其他帧的情况下获取 GIF 图像的第一帧

android - ScrollView 仍然落后于它的区域

javascript - 带有信息窗口的 Google Maps API 多个标记

javascript - 动画折线因纬度/经度数组而失败

javascript - JQuery - 复制元素的尺寸和绝对位置

java - 如何取消选择我的所有复选框

objective-c - 如何使用 Google Maps API 搜索地点和邮政编码?