我有一个从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恶作剧。
有没有更好的方法来做到这一点,或者创建标记并将它们全部批量添加到我不知道的地方?
答案 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做其他事情然后放更多标记。