首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >刷新许多Google标记位置,而不刷新Android中的整个地图

刷新许多Google标记位置,而不刷新Android中的整个地图
EN

Stack Overflow用户
提问于 2015-03-07 11:02:05
回答 3查看 9.1K关注 0票数 3

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

我想做的是,在接收到新职位时刷新位置标记。(我不想刷新整个地图)

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

为了详细说明结构,我有一个运行MQTT的服务,每次接收到一个位置时,我都会将它添加到一个Hashmap中,它表示我的地图数据源。这个HashMap是一个扩展可观测的单例。此外,我的片段显示我的实现观察者。

实现观察者的片段中的代码

代码语言:javascript
复制
 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
     }
 }

从我的单一职位列表中提取的代码

代码语言:javascript
复制
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的代码

代码语言:javascript
复制
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);


}

在我的更新功能中,有人知道如何在不刷新整个地图的情况下单独移动每个标记吗?我可以使用Handler从其他线程更新Map以修改主UI线程吗?

非常感谢

编辑:

因为AniV给出的第一种方法对我不起作用,所以我尝试使用Asyntask,当我的观察者从可观察的列表中得到通知时,这个任务就会运行。

来自观察者片段的代码:

代码语言:javascript
复制
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的代码:

代码语言:javascript
复制
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,因此标记从未添加到myGoogleMap中。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-11 16:05:14

通过使用AsyncTask,我终于成功地完成了这一任务。

在编辑过程中,我说我的Google对象的空实例有一些问题。这是我观察到的单身人造成的。实际上,在构造函数中,我使用了

代码语言:javascript
复制
VehicleMapFragment mapFragmentObserver = new VehicleMapFragment();
this.addObserver(mapFragmentObserver); 

这个代码示例重新创建了我的片段的另一个实例,这就是ii为什么有Null对象的原因。

为了纠正这个问题,我只使用了:

代码语言:javascript
复制
ListPositions.getInstance().addObserver(this);

在我的碎片观察者里。

因此,如果您想在不刷新整个地图的情况下更新标记位置,则可以使用观察者/可观察模式,并使用Asynctask更新标记位置。

票数 1
EN

Stack Overflow用户

发布于 2015-03-10 00:07:29

你在这里有两个选择:

  • 要么使用setPosition()方法编程更新标记位置。 标记标记= MarkerOptions().position(entry.getValue()).title(entry.getKey()));(新的googleMap.addMarker) 使用此对象更改其位置: Marker.setPosition(新LatLng(5,5));
  • 或者如您所说,使用处理程序: 处理程序locationHandler;最终静态长刷新= 10 * 1000;最终静态int主题= 0;私有GoogleMap mMap;私有标记myMarker = null; 和onCreate() locationHandler = new (){ public handleMessage(Message msg) { if (msg.what == SUBJECT) { updateMarker();this.sendEmptyMessageDelayed(SUBJECT,刷新);} };

在必须在特定时间间隔更新位置的情况下,处理程序选项更好。

票数 0
EN

Stack Overflow用户

发布于 2016-12-06 16:13:57

我有这样的东西。我每5分钟收到一份设备列表,以更新地图的位置。

你对此有何看法

代码语言:javascript
复制
private HashMap<String, Marker> mMarkers = new HashMap<>();    

private void drawDevicesOnMap() {
            if (isMapReady) {
                for (Device device : mDeviceList) {

                    List<com.model.Location> locationList = device.getLocations();

                    if (locationList != null && !locationList.isEmpty()) {
                        if (mMarkers.containsKey(device.getId())) {  //update
                            Marker m = mMarkers.get(device.getId());
                            m.setPosition(device.getLocations().get(0).getCoordinates().getLatLng());
                            mMarkers.put(device.getId(), m);
                        } else { //add
                            MarkerOptions markerOptions = new MarkerOptions();
                            markerOptions.position(locationList.get(0).getCoordinates().getLatLng());
                            markerOptions.icon(BitmapDescriptorFactory.defaultMarker(device.getHue()));
                            markerOptions.title(device.getNickname());
                            Marker marker = mMap.addMarker(markerOptions);
                            mMarkers.put(device.getId(), marker);
                        }
                    }
                }
            }
        }

如果在HashMap中找到具有x id的设备的标记,则更新其位置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28914182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档