首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不锁定UI线程的情况下,将许多标记快速添加到Google Map API v2中的MapFragment?

如何在不锁定UI线程的情况下,将许多标记快速添加到Google Map API v2中的MapFragment?
EN

Stack Overflow用户
提问于 2015-05-21 01:27:32
回答 2查看 957关注 0票数 2

我正在使用Google Map API v2并在MapFragment中的地图上显示标记。

我需要快速添加许多标记到地图,但不锁定UI线程。我尝试过两种方法,但要么添加大量标记需要很长时间,要么在绘制所有标记时UI线程冻结。有没有一种不同的方法可以做得更好?

方法#1 (快速添加它们,但锁定UI线程,直到它们全部添加):

代码语言:javascript
复制
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秒来添加所有标记):

代码语言:javascript
复制
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秒逐渐添加它们?

EN

回答 2

Stack Overflow用户

发布于 2015-05-21 01:44:56

单个可见地图区域上的2k+标记是要管理和绘制的许多子视图和对象,更不用说一些潜在的可用性问题了。

查看标记群集:

https://developers.google.com/maps/documentation/android/utility/marker-clustering

这允许您将附近的标记“聚集”到一个折叠的标记中。你应该尝试将你的标记/子视图的总数减少到几十个。无论如何,像这样的技术应该会有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2015-08-25 05:30:40

我认为您可以编写一个AsynTask并在onProgress中发布标记。不过我并不是一个很喜欢使用AsyncTasks的人,所以我会使用RxJava (使用针对安卓特定调度器的RxAndroid )。

示例:

代码语言:javascript
复制
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) { }
    });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30356483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档