将多个标记添加到地图(v2)

时间:2013-03-21 02:07:31

标签: android google-maps google-maps-api-3 google-maps-markers

我有一个从API中提取的ArrayList列表,这些列表被添加到从SupportMapFragment生成的GoogleMap中。

我从列表中创建标记并将它们添加到地图中,然后将标记ID添加到标记索引的地图中,稍后通过onInfoWindowClick进行引用。

public void addLocationMarkers() {
    mGoogleMap.clear();
    LocationBlahObject thelocation;
    int size = mNearbyLocations.size();
    for (int i = 0; i < size; i++) {
        thelocation = mNearbyLocations.get(i);
        Marker m = mGoogleMap
                .addMarker(new MarkerOptions()
                        .position(
                                new LatLng(thelocation.Latitude,
                                        thelocation.Longitude))
                        .title(thelocation.Name)
                        .snippet(thelocation.Address)
                        .icon(BitmapDescriptorFactory
                                .defaultMarker(thelocation.getBGHue())));
        mMarkerIndexes.put(m.getId(), i);
    }
}

我的问题是,有时位置列表可能有数百个,并且地图会在添加标记时挂起几秒钟。

我尝试过使用AsyncTask,但很明显,这里的大部分工作都在操纵UI,而且我确实没有任何runOnUiThread或publishProgress恶作剧。

有没有更好的方法来做到这一点,或者创建标记并将它们全部批量添加到我不知道的地方?

2 个答案:

答案 0 :(得分:3)

刚刚从谷歌那里得到了这个。这就是我如何解决添加100多个标记的滞后问题。他们慢慢流行,但我认为没关系。

class DisplayPinLocationsTask extends AsyncTask<Void, Void, Void> {
    private List<Address> addresses;

    public DisplayPinLocationsTask(List<Address> addresses) {
        this.addresses = addresses;
    }

    @Override
    protected Void doInBackground(Void... voids) {
        for (final Address address : addresses) {
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    LatLng latLng = new LatLng(address.latitude, address.longitude);
                    MarkerOptions markerOptions = new MarkerOptions();
                    markerOptions.position(latLng);
                    mMap.addMarker(markerOptions);
                }
            });

            // Sleep so we let other UI actions happen in between the markers.
            try {
                Thread.sleep(5);
            } catch (InterruptedException e) {
                // Don't care
            }
        }

        return null;
    }
}

答案 1 :(得分:1)

氪是对的。为避免在UI线程上出现滞后,您必须同时放置不多的标记。放几个标记然后让UI Thread做其他事情然后放更多标记。