我正在使用Google Map API v2并在MapFragment中的地图上显示标记。
我需要快速添加许多标记到地图,但不锁定UI线程。我尝试过两种方法,但要么添加大量标记需要很长时间,要么在绘制所有标记时UI线程冻结。有没有一种不同的方法可以做得更好?
方法#1 (快速添加它们,但锁定UI线程,直到它们全部添加):
public void addMarkersFast(List<MarkerThing> thingsToShow) {
if (getMap() == null) return; // Will be null for any device without google play services installed
for (MarkerThing thing : thingsToShow) {
getMap().addMarker(createMarker(thing));
}
}方法#2 (立即开始显示,但可能需要20-30秒来添加所有标记):
public void addMarkersSlow(final MarkerThingArray thingsToShow) {
if (getMap() == null) return; // Will be null for any device without google play services installed
MarkerThing thing = thingsToShow.get(i);
getMap().addMarker(createMarker(thing));
(new Handler()).postDelayed(new Runnable() { // give some time for main thread to draw
@Override
public void run() {
addMarkersSlow(thingsToShow, i + 1);
}
}, 1);
}我如何才能以不同的方式显示2k+标记场景中的所有标记,而不像方法1那样锁定UI线程3-4秒,也不像方法2那样花30秒逐渐添加它们?
发布于 2015-05-21 01:44:56
单个可见地图区域上的2k+标记是要管理和绘制的许多子视图和对象,更不用说一些潜在的可用性问题了。
查看标记群集:
https://developers.google.com/maps/documentation/android/utility/marker-clustering
这允许您将附近的标记“聚集”到一个折叠的标记中。你应该尝试将你的标记/子视图的总数减少到几十个。无论如何,像这样的技术应该会有所帮助。
发布于 2015-08-25 05:30:40
我认为您可以编写一个AsynTask并在onProgress中发布标记。不过我并不是一个很喜欢使用AsyncTasks的人,所以我会使用RxJava (使用针对安卓特定调度器的RxAndroid )。
示例:
Observable.just(thingsToShow)
.subscribeOn(Schedulers.newThread())
.map(new Func1<MarkerThing, Marker>() {
@Override
public Marker call(MarkerThing thing) {
return createMarker(thing);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Marker>() {
@Override
public void onNext(Marker marker) {
getMap().addMarker(marker);
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) { }
});https://stackoverflow.com/questions/30356483
复制相似问题