3

我有一个从 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 恶作剧都没有表现出任何区别。

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

4

2 回答 2

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;
    }
}
于 2014-10-23T17:38:22.387 回答
1

氪是对的。为避免 UI 线程滞后,您一次不能放置太多标记。放置几个标记然后让 UI 线程做其他事情然后放置更多标记。

于 2014-02-13T02:50:49.447 回答