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

Googleからこれに出くわしました。これが、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 に答える