是否可以从AsyncTask添加标记?

时间:2015-09-27 05:42:17

标签: android google-maps

我的Android上有一张Google地图,我是新版Google Maps API的新用户。它上面有一个初始标记。 这是显示地图和初始标记的方法:

  @Override
    public void onMapReady(GoogleMap map) {
        //map is ready
        // latitude and longitude
        double latitude = latitud_del_hotel;
        double longitude =longitud_del_hotel;

        // create marker
        MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title(nombre_del_hotel).icon(BitmapDescriptorFactory.fromResource(R.drawable.poi));

        // Changing marker icon
        // marker.icon(BitmapDescriptorFactory
        // .defaultMarker(BitmapDescriptorFactory.HUE_ROSE));

        // adding marker
        map.addMarker(marker);
        map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        CameraPosition cameraPosition = new CameraPosition.Builder()
                .target(new LatLng(latitud_del_hotel, longitud_del_hotel)).zoom(15).build();
        map.animateCamera(CameraUpdateFactory
                .newCameraPosition(cameraPosition));
    }

现在,我需要在其上放置其他标记。这些标记是我在活动中的另一个方法上检索的JSON对象。

可能我的问题很愚蠢,但我不知道如何在同一张地图上添加标记但是在其他方法上创建。

这是我如何在另一种方法上创建新标记:

 hotel.setNombre(obj.getString("nombre_hotel"));
                                        hotel.setLatitud(obj.getDouble("latitud_hotel"));
                                        hotel.setLongitud(obj.getDouble("longitud_hotel"));
                                        hotel.setDireccion(obj.getString("direccion_hotel"));

                                        String nombre = obj.optString("nombre_hotel");
                                        Log.d("NOMBRE=", nombre);

                                        String latitud = obj.optString("latitud_hotel");
                                        double latitud_del_hotel = Double.parseDouble(latitud);

                                        String longitud = obj.optString("longitud_hotel");
                                        double longitud_del_hotel = Double.parseDouble(longitud);

                                        // create marker
                                        MarkerOptions marker = new MarkerOptions().position(new LatLng(latitud_del_hotel, longitud_del_hotel)).title(nombre).icon(BitmapDescriptorFactory.fromResource(R.drawable.poi));


                                        map.addMarker(marker);

但显然,行map.addMarker(marker);会显示警告:无法解析符号映射。

很抱歉,如果这很容易解决,但我不能。

谢谢。

1 个答案:

答案 0 :(得分:3)

在你的onMapReady(...)中添加一个对返回地图的字段引用。

public void onMapReady(GoogleMap map) {
    this.googleMap = map;

然后,你可以这样做:

// create marker
if(this.googleMap != null) {
    MarkerOptions marker = new MarkerOptions(...);
    this.googleMap.addMarker(marker);
}

这可能会产生所谓的竞争条件 - 如果您的网络呼叫检索酒店位置信息在地图准备好之前返回结果,您将永远不会将结果添加到地图中。

你可以通过以下方式解决这个问题:

// Create this as a field:
List<MarkerOptions> markerOptions = new ArrayList<>();

MarkerOptions marker = new MarkerOptions(...);
if(this.googleMap != null) {
    this.googleMap.addMarker(marker);
} else {
    this.markerOptions.add(marker);
}

然后,在onMapReady(...)的底部:

if(this.markerOptions != null && !this.markerOptions.isEmpty()) {
    for(MarkerOption markerOption : this.markerOptions) {
        this.googleMap.addMarker(markerOption);
    }
}