如何使用来自 Firebase Google Maps API Android 的数据更新标记位置
Posted
技术标签:
【中文标题】如何使用来自 Firebase Google Maps API Android 的数据更新标记位置【英文标题】:How to update marker positions with data from Firebase Google Maps API Android 【发布时间】:2018-05-20 17:34:21 【问题描述】:我正在创建一个使用 Firebase 数据库实时跟踪用户的应用。每个用户都使用标记显示在地图中。
当有新的位置更新时,必须更新标记。问题是,每次检索到新的位置更新时,使用 Firebase 方法 onDataChange() 或类似方法,我无法访问旧标记以将其删除并创建新标记或仅更新旧标记,因为标记没有不存在。
我尝试使用 Gson 在 SharedPreferences 中保存标记,但是当我将标记传递给 json 时,应用程序崩溃了。
有人知道如何更新标记吗?
这是写在onDataChange()里面的:
for (User user: usersList)
Gson gson = new Gson();
/*
String previousJson = preferences.getString(user.getId()+"-marker", "");
Marker previousMarker = gson.fromJson(previousJson, Marker.class);
if (previousMarker!=null) markerAnterior.remove();
*/
final LatLng latlng = new LatLng(user.getLastLocation().getLatitude(), user.getLastLocation().getLongitude());
MarkerOptions markerOptions = new MarkerOptions()
.position(latlng)
.title(user.getId());
Marker marker= mMap.addMarker(markerOptions);
// String newJson = gson.toJson(marker); //CRASH
// editor.putString(user.getId()+"-marker", newJson);
// editor.commit();
谢谢。
【问题讨论】:
【参考方案1】:创建一个将用户 ID 映射到标记的 HashMap 实例变量:
private Map<String, Marker> mMarkerMap = new HashMap<>();
然后,在 HashMap 中填充新的标记,以便以后检索它们。
如果标记已经存在,只需更新位置:
for (User user : usersList)
final LatLng latlng = new LatLng(user.getLastLocation().getLatitude(), user.getLastLocation().getLongitude());
Marker previousMarker = mMarkerMap.get(user.getId());
if (previousMarker != null)
//previous marker exists, update position:
previousMarker.setPosition(latlng);
else
//No previous marker, create a new one:
MarkerOptions markerOptions = new MarkerOptions()
.position(latlng)
.title(user.getId());
Marker marker = mMap.addMarker(markerOptions);
//put this new marker in the HashMap:
mMarkerMap.put(user.getId(), marker);
【讨论】:
我将 HashMap 从 Firebase 的 onDataChange() 中取出,看来它有效!!但为什么? Firebase 调用是异步的,所以每个新位置的 mMarkerMap 都应该是 null,我错了吗? @smartgg 是的,mMarkerMap
需要是类级别的实例变量,在任何方法之外定义。你能澄清一下为什么你不明白它为什么起作用吗? Firebase 调用只是为您提供当前的数据快照。您必须在应用程序中本地跟踪现有标记,这就是 HashMap 的作用。
谢谢。我告诉过你,因为当我尝试从 Firebase 返回一些数据时,例如,如果我在 onDataChange 之外声明一个 ArrayList 并在 onDataChange 内部添加一些值,当我在外部调用 ArrayList 时,它没有保存任何值onDataChange.
@smartgg 如果您将 ArrayList 声明为类级实例变量,它应该包含添加到其中的所有数据,只要应用程序没有退出并重新启动。跨度>
@DanielNugent 你能看看我的问题吗?[链接] (***.com/questions/47731956/…)。谢谢以上是关于如何使用来自 Firebase Google Maps API Android 的数据更新标记位置的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Firebase 数据库锁定给来自特定(电子邮件)域的任何用户?
使用 google firebase 和 spring 进行身份验证
如何将从 Google Place API 获取的信息存储到 Firebase?
Firebase 与 Android Java 中的 Google 云消息传递