哪个显示许多标记映射v2 android的性能更好?

时间:2014-11-06 13:03:56

标签: android google-maps google-maps-markers google-maps-android-api-2

我在谷歌地图v2中有超过10,000个标记我从我的服务器上拿走了,我有一个问题要把它带到地图上显示,我有两种技术。

  1. 我一次获取所有数据标记并在地图上显示
  2. 我根据我在地图上看到的位置获取一段数据标记,例如:当用户将地图指向另一个位置时,最近的标记将从服务器显示。
  3. 我使用第一种方法,结果是地图停止(冻结)几秒钟,之后标记出现,我的地图运行缓慢..

    我也使用第二种方式,它比第一种方法快,但在互联网连接较弱时会很慢

    从上面两种方式更高效,更快或可能是其他方式成为我的地图以获得更好的表现? 感谢..

3 个答案:

答案 0 :(得分:2)

结帐Android Map Extensions。除了@ d.aemon关于sqlite的注意事项,您还可以使用聚类库以及根据用户在地图上的位置动态添加标记。

如果您使用的是Android Studio,则快速设置群集和动态标记:

在build.gradle(module:app)中:

compile 'com.androidmapsextensions:android-maps-extensions:2.2.0'
compile 'com.google.android.gms:play-services-maps:6.5.87'

在代码中创建地图时:

 map.setClustering(new ClusteringSettings().enabled(true)
                .addMarkersDynamically(true).minMarkersCount(5));

我没有你做的标记数量,但是这个库远远超过了Google Utilities库。它在UI中更具流动性。我已经尝试了各种不同的数组(列表,稀疏数组等)来处理我的数据,到目前为止它工作得非常好。我确信使用sqlite的建议会同样快。

最初当你添加所有标记时,你需要找出在Async任务中处理它的最快/最好的方法(因为我正在使用... btw Android Query是一个非常好的异步库,用于异步东西),所以看看:

List<Marker> markers = new ArrayList<Marker>();

...虽然在后台进行,但Android Map Extensions提供的标记群集将为您完成剩下的工作。

我还看到其他技术,比如在异步任务中使用计时器,基本上一次添加100个标记,然后暂停异步任务,这样UI仍然有些响应。

希望其中一些有用。

答案 1 :(得分:1)

我不会在第一时间从互联网上动态刷新标记。尝试将两种方式结合起来:

  1. 将所有标记数据下载到本地数据库
  2. 每次用户更改地图视图和更新标记时查询数据库(这在SQLite中非常快)
  3. 这种方法也有一些缺点:

    • 用户缩小时无法避免刷新大量标记(考虑限制显示的最大标记量或某种标记聚类)
    • 即使标记数量较少,每次刷新标记也需要大量时间(我的应用程序在Nexus 7 2012上刷新约400 - 500个标记,大约需要250 - 300毫秒)

    我仍然在努力解决这类问题,因为我的应用程序必须显示大约8千个标记。到目前为止,我发现只有一种聚类方法完全无法使用,因为聚类本身与刷新本身的时间大致相同,因此每次更改缩放级别时,UI线程都会被阻止很多秒。

答案 2 :(得分:0)

集群地图扩展很棒,但是如果不必做那么多工作,只是想从URL加载自定义制造商徽标,下面的解决方案将为您服务。

private fun loadMarkerOnGoogleMap(barVenueList: List<VenueModel>) {
    for (row in barVenueList) {
        val frame = BitFact.decodeResource(mActivity.resources, R.drawable.pin)
        getBitmap(mActivity, row.logoImage, object : BitmapUtils.OnDownloadCallBack {
            override fun marker(bitmap: Bitmap) {
                val finalLogo = mergeToPin(frame, bitmap)
                if (row.getLatitude() != null && row.getLongitude() != null) {
                    val latLong = LatLng(row.getLatitude()!!, row.getLongitude()!!)
                    val markerOptions = MarkerOptions().position(latLong)
                    markerOptions.title(row.venueName)
                    markerOptions.icon(BitDescFact.fromBitmap(finalLogo))
                    markerOptions.snippet(row.venueName)
                    val addMarker = mMap!!.addMarker(markerOptions)
                    addMarker.tag = row //set tag to get data when required

                }
            }
        })
    }
}

/**
 * @param mActivity Activity,
 * @param imageURL : String image url
 * @param mCallBack : OnDownloadCallback
 */
fun getBitmap(mActivity: Activity, imageURL: String, mCallBack: OnDownloadCallBack) {
    Glide.with(mActivity)
        .asBitmap()
        .load(imageURL)
        .into(object : CustomTarget<Bitmap>(50, 50) {
            override fun onLoadCleared(placeholder: Drawable?) {
                println("onLoadCleared ## ")
            }

            override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
                println("onResourceReady ## ")
                mCallBack.marker(resource)
            }
        })
}

/**
 * Interface to listen download
 */
interface OnDownloadCallBack {
    fun marker(bitmap: Bitmap)
}