【问题标题】:Background rendering for cluster in google maps utils谷歌地图实用程序中集群的背景渲染
【发布时间】:2014-07-01 16:37:06
【问题描述】:

为了简化问题,我将参考Google Maps Utils library demo project - custom marker clustering activity

(链接是直接到代码) 第 69 行的评论说明了一切: // 注意:此方法在 UI 线程上运行。不要在这里花太多时间(就像这个例子)。

我的项目有一些较重的渲染,并且在操作地图时会产生一些滞后。我尝试将代码移动到 AsyncTask 但它只呈现默认标记。

我尝试将代码移至 onClusterRendered(),但地图响应更慢。 我想我可以为我的集群预渲染很多可能性,但这并不是最好的方法

我正在尝试找出正确的方法来使其顺利运行。代码会更好

【问题讨论】:

  • 很奇怪,没有建议?
  • 这有什么好运气吗?遇到了同样的问题并试图确定如何绕过处理 UI 线程上的事情......
  • 我在同一条船上。很想得到一个体面的答案。尝试使用 AsyncTask 没有运气。
  • 我使用了预渲染的方式
  • @ShaiLevy,您所说的“预渲染方法”是什么意思?您的方法是否能够处理 5-10k 个标记?如果可以的话,请帮忙

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


【解决方案1】:

老问题,但我遇到同样问题时才来这里。

我认为问题在于onBeforeClusterRendered 的markerOptions 参数是在渲染期间/之后被丢弃的局部变量。

相反,保持对cluster 参数的引用允许您在加载图标后调用getMarker(cluster),这将返回标记(如果它仍然存在)或null。然后你可以使用marker.setIcon(...)。

为避免暂时看到默认标记,您可以在加载图标之前隐藏标记。

这对我来说效果很好,并且在加载图标时保持地图/UI 响应。

@Override
protected void onBeforeClusterRendered(Cluster<Person> cluster, MarkerOptions markerOptions) {
    // Hide default marker, load icon on background thread and unhide.
    markerOptions.visible(false);
    new LoadClusterMarkersAsync(cluster).execute();
}

private class LoadClusterMarkersAsync extends AsyncTask<Void, Void, Void> {
    private Cluster<Person> cluster;

    public LoadClusterMarkersAsync(Cluster<Person> cluster) {
        super();
        this.cluster = cluster;
    }

    @Override
    protected Void doInBackground(Void... v) {
        // Load icon...
        return null;
    }

    @Override
    protected void onPostExecute(Void v) {
        super.onPostExecute(v);
        Marker marker = getMarker(cluster);
        if (marker != null) {
            marker.setIcon(...);
            marker.setVisible(true);
        }
    }
}

【讨论】:

    【解决方案2】:
    override fun onBeforeClusterRendered(
            cluster: Cluster<MapItem>,
            markerOptions: MarkerOptions
        ) {
            // Draw multiple items.
            // Hide markers while getting cluster icon
            markerOptions.visible(false)
            // This *must* run on the Main thread
            lifecycleScope.launch(Dispatchers.Main) {
                val icon = getClusterIcon(cluster)
                getMarker(cluster)?.apply {
                    setIcon(icon)
                    isVisible = true
                }
            }
        }
    
    // Run this on dispatcher optimized for CPU-intensive work
    private suspend fun getClusterIcon(cluster: Cluster<MapItem>): BitmapDescriptor =
            withContext(Dispatchers.Default) { ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      • 2021-11-10
      • 2019-01-20
      相关资源
      最近更新 更多