Android google maps utils中群集的背景渲染

Android google maps utils中群集的背景渲染,android,google-maps,google-maps-markers,google-maps-android-api-2,Android,Google Maps,Google Maps Markers,Google Maps Android Api 2,为了简化问题,我将参考 (链接直接指向代码) 第69行的评论说明了一切: //注意:此方法在UI线程上运行。不要在这里花费太多时间(如本例中) 我的项目渲染比较重,在操作贴图时会产生一些延迟。我尝试将代码移动到AsyncTask,但它只呈现默认标记 我尝试将代码移动到onClusterRendered(),但映射的响应速度更慢。 我想我可以为我的集群预先渲染很多可能性,但这并不是最好的方法 我正试图找出正确的方法使这一切顺利进行。代码会更好旧版本,但当我遇到同样的问题时,我来到这里 我认为问题在

为了简化问题,我将参考

(链接直接指向代码) 第69行的评论说明了一切: //注意:此方法在UI线程上运行。不要在这里花费太多时间(如本例中)

我的项目渲染比较重,在操作贴图时会产生一些延迟。我尝试将代码移动到AsyncTask,但它只呈现默认标记

我尝试将代码移动到onClusterRendered(),但映射的响应速度更慢。 我想我可以为我的集群预先渲染很多可能性,但这并不是最好的方法


我正试图找出正确的方法使这一切顺利进行。代码会更好

旧版本,但当我遇到同样的问题时,我来到这里

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

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

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

这对我来说效果很好,并且在加载图标时保持了地图/用户界面的响应性

@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);
        }
    }
}
@覆盖
在呈现群集之前受保护的void(群集群集、标记选项标记选项){
//隐藏默认标记,在背景线程上加载图标并取消隐藏。
标记选项。可见(假);
新的LoadClusterMarkersAsync(集群).execute();
}
私有类LoadClusterMarkersAsync扩展AsyncTask{
私有集群;
公共LoadClusterMarkersAsync(群集){
超级();
this.cluster=cluster;
}
@凌驾
受保护的空位背景(空位…v){
//加载图标。。。
返回null;
}
@凌驾
受保护的void onPostExecute(void v){
super.onPostExecute(v);
Marker=getMarker(集群);
如果(标记!=null){
marker.setIcon(…);
marker.setVisible(true);
}
}
}
在ClusterRendered之前覆盖乐趣(
集群:集群,
标记选项:标记选项
) {
//绘制多个项目。
//获取群集图标时隐藏标记
标记选项。可见(假)
//此*必须*在主线程上运行
lifecycleScope.launch(Dispatchers.Main){
val图标=getClusterIcon(群集)
getMarker(群集)?。应用吗{
设置图标(图标)
isVisible=true
}
}
}
//在为CPU密集型工作而优化的dispatcher上运行此命令
private suspend fun getClusterIcon(群集:群集):BitmapDescriptor=
withContext(Dispatchers.Default){。。。

奇怪,没有建议?这方面运气好吗?遇到了同样的问题,并试图确定如何在UI线程上处理事情…我也在同一条船上。希望有一个像样的答案。尝试使用AsyncTask,但运气不好。我使用了预渲染approach@ShaiLevy,您所说的“预渲染方法”是什么意思?您的方法是否能够处理5-10k标记?如果可以,请提供帮助
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) { ...