【问题标题】:which is better performance to display many marker maps v2 android?显示许多标记图 v2 android 的性能更好?
【发布时间】:2020-04-15 21:19:55
【问题描述】:

我在 google maps v2 中有超过 10.000 个标记,我从我的服务器上拿走了,我无法将它显示在地图上,我有两种技术。

  1. 我一次取出所有数据标记并显示在地图上
  2. 我根据我在地图上看到的位置获取一条数据标记,例如:当用户将他的地图指向另一个位置时,将从服务器显示最近的标记。

我使用第一种方法,结果是地图停止(冻结)几秒钟,之后出现标记,我的地图运行缓慢..

我也使用第二种方式,比第一种方式快,但网速较弱时会很慢

从以上两种方式哪个更高效更快,或者可能是其他方式成为我的地图以获得更好的性能? 谢谢..

【问题讨论】:

  • 你使用的是and数组还是sqlite db?

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


【解决方案1】:

查看Android Map Extensions。除了 @d.aemon 关于 sqlite 的说明外,您还可以使用聚类库以及根据用户在地图上的位置动态添加标记。

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

在 build.gradle(模块: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 会一样快。

最初,当您添加所有标记时,您需要找出在异步任务中处理它的最快/最佳方法(正如我正在使用的那样......顺便说一句,Android Query 是一个非常好的异步内容库) ,所以请查看:

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

...虽然在后台执行,但 Android 地图扩展提供的标记聚类将为您完成其余的工作。

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

希望对你有所帮助。

【讨论】:

    【解决方案2】:

    首先我不会从互联网上即时刷新标记。尝试结合两种方式:

    1. 将所有标记数据下载到本地数据库
    2. 每次用户更改地图视图和更新标记时查询数据库(这在 SQLite 中非常快)

    不过,这种方法也有一些缺点:

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

    我还在为这类问题苦苦挣扎,因为我的应用程序必须显示大约 8000 个标记。到目前为止,我只发现了一种完全无法使用的集群方法,因为集群本身与刷新本身所用的时间大致相同,因此每次我更改缩放级别时都会阻塞 UI 线程很多秒。

    【讨论】:

      【解决方案3】:

      集群地图扩展非常棒,但如果不需要做太多工作,只是想从 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)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-19
        • 2015-03-14
        • 2013-01-27
        • 2013-11-25
        • 2014-05-01
        • 2014-11-08
        • 1970-01-01
        相关资源
        最近更新 更多