Android 在Here SDK映射对象上执行操作是否有线程限制?
我对HERE Android SDK的理解是,有一个Android 在Here SDK映射对象上执行操作是否有线程限制?,android,here-api,Android,Here Api,我对HERE Android SDK的理解是,有一个MapView有一个支持Map对象。应在Map对象上执行添加对象、设置中心、缩放等操作,这最终会反映在MapView上 问题: 对于必须在Map对象上执行的操作的线程是否有任何限制?例如,它们都必须在UI线程上调用吗?此外,是否应同步多个后续调用 我这样做是因为我想在地图中进行多次更改(调整地图视图的大小、更改一些可见图层、更改方案、添加地图管线并缩小到管线的边界框)。当我尝试这个时,它有时有效,但有时无效。有时,仅应用部分操作。例如,除未应用
MapView
有一个支持Map
对象。应在Map
对象上执行添加对象、设置中心、缩放等操作,这最终会反映在MapView
上
问题:
对于必须在Map
对象上执行的操作的线程是否有任何限制?例如,它们都必须在UI线程上调用吗?此外,是否应同步多个后续调用
我这样做是因为我想在地图中进行多次更改(调整地图视图的大小、更改一些可见图层、更改方案、添加地图管线并缩小到管线的边界框)。当我尝试这个时,它有时有效,但有时无效。有时,仅应用部分操作。例如,除未应用缩放外,其他所有操作均有效
我知道有些听众可以帮助我:
Map.OnTransformListener
-当缩放操作结束时,我可以使用此选项通知我Map.OnSchemeChangedListener
-我可以使用它来知道方案更改事件何时结束map.setCenter(coordinate, Animation.BOW, 18, 0f, 60f);
map.addMapObject(routeObject);
map.setVisibleLayers(layersToShow, true);
map.setScheme(Map.Scheme.NORMAL_DAY)
请注意,在上面的示例中,我将在
setCenter
之后立即进行更改,甚至在动画完成之前。这是使用API的预期方式吗?对从哪个线程调用API没有限制。在内部,所有调用都是同步的且线程安全的
您需要的是MapView#executeSynchronized API。这将在一个屏幕上重新绘制一些操作。[至少在几年前我写API的时候]
发生这种情况是因为底层渲染线程开始从调用线程绘制一些命令。这会导致后续调用失效。感谢您提供有关
executeSynchronized
的提示。还是没用。我重新安排了地图操作,最后(在所有其他操作之后)执行setCenter
。但有时它并没有完成操作。它设置中心,但不放大到我指定的值。由于setCenter
是一个原子调用,我看不出还有什么问题。我还尝试了zoomTo
,但没有效果。我在一个位置列表中滚动,每次选择其中一个位置时,我都会执行一系列地图操作。当我快速滚动时,我看到了问题(之前的操作尚未完成)。有什么建议吗?哦,也因为你是动画。弓。这将取消以前的所有操作。根据渲染线程发生的情况,您将看到不同的结果。一种方法是先设置属性,然后启动延迟设置中心~100ms。一个渲染帧应该是你的技巧真的很有见地。谢谢但我仍然看到了问题(还尝试添加100毫秒延迟)。就像你说的,如果我使用动画.NONE
,那么问题就消失了。使用LINEAR
或BOW
约30%的时间,缩放操作仅部分完成。“渲染线程”是什么意思?有没有可能以某种方式调试或分析它?SDK的设计非常类似于标准的渲染引擎。应用程序主线程拦截用户事件并将一组操作委托给后台线程。后台线程承载绘制地图的opengl上下文。对于外部开发人员来说,没有一种简单的方法可以进一步打开该框,因为所有代码都是专有的。执行动画的另一种方法是制作自己的贝塞尔曲线动画。计算关键点并逐帧手动移动贴图以制作自定义动画。