{"version":"0.1.0","code":"0000","result":true,"message":"处理成功","errdetail":"","timestamp":1671508867881,"data":{"id":71712779,"title":"6.5.1图层对线程的要求","slug":"fwakxg","format":"lake","bookId":26046811,"body":null,"body_draft":null,"body_html":"

基本介绍

前序文档:设备创建销毁

关联文档:多屏多线程渲染


图层类似UI,所以图层对线程的要求和UI一样,需要在UI线程中执行,包括图层的所有业务都应该在UI线程中执行。但是有可能碰撞以下两个问题:

1,路线绘制比较耗时(尤其是长路线,路线数据量大,渲染路线数据多),在UI线程中可能引发UI显示的卡顿(尤其是设备性能相对较差时);

2,图层的内聚,会增加大量的线程转换消息(从观察者回调线程转换到UI线程),造成消息挤压,进而也会影响到UI线程的响应时间,表现为UI操作体验。


解决方案是:

把所有图层业务放在另外一个线程中,通过com.autonavi.gbl.servicemanager.ServiceMgr.setUiLooper接口,把这个图层线程告诉AutoSDK,那么图层内聚的业务会全部被切换到这个图层线程中执行。从480版本开始,支持多线程中调用图层接口(但是不允许在图层的回调接口中调用图层接口,避免互锁等问题)。客户端无需关注线程,可直接调用图层接口。在550版本,HMI需要在每个Device调用setUiLooper接口,通知ServiceMgr创建图层线程,图层内聚默认使用了message bus切换线程,不会使用设置进来的线程。

场景图

导航过程中的一些内聚场景(电子眼,交通设施,车标等)

\"image.png\"

核心接口

//设置biztaks looper\nboolean com.autonavi.gbl.servicemanager.ServiceMgr.setUiLooper(@BIZ_TASK_DEVICE_ID.BIZ_TASK_DEVICE_ID1 int id,Looper loop)\n\n//移除biztaks\nboolean com.autonavi.gbl.servicemanager.ServiceMgr.removeUiLooper(@BIZ_TASK_DEVICE_ID.BIZ_TASK_DEVICE_ID1 int id)

说明:函数详情,请复制函数名称到在线API搜索

调用示例

.. // 创建Looper线程\n\n// 设置主屏图层业务线程\nServiceMgr.getServiceMgrInstance().setUiLooper(BIZ_TASK_DEVICE_ID.BIZTaskDeviceIDDefault, looper);\n\n....    // 图层业务处理\n\n// 删除主屏图层业务线程\nServiceMgr.getServiceMgrInstance().removeUiLooper(BIZ_TASK_DEVICE_ID.BIZTaskDeviceIDDefault);
/**\n     * 天气结果通知\n     *\n     * @details 查询路径天气成功后返回该路径的天气情况。\n     * @param[in] requestId        天气结果对应的请求ID\n     */\n    @Override\n    public void onWeatherUpdated(long requestId, final ArrayList<WeatherLabelItem> pItems) {\n        int size = pItems == null ? 0 : pItems.size();\n        if (size > 0) {\n            //跑到Biz线程中执行图层业务接口\n            sendBizMessage(new Runnable() {\n                @Override\n                public void run() {\n                    final ArrayList<BizRouteWeatherInfo> weatherInfos = new ArrayList<>();\n                    for (int i = 0; i < pItems.size(); i++) {\n                        BizRouteWeatherInfo info = new BizRouteWeatherInfo();\n                        info.weatherLabelInfo = pItems.get(i);\n                        weatherInfos.add(info);\n                    }\n                    \n                    bizGuideRouteControl.updateRouteWeatherInfo(weatherInfos);\n                }\n            });\n        }\n    }\n

注意事项

1,所有回调中(点击回调,渲染回调,或其它业务观察者回调),不能直接调用图层接口,都需要切换线程到图层的线程中(UI线程或者Biz线程)

","body_lake":null,"pub_level":null,"status":"0","updated_at":"2022-04-06 07:04:31","deleted_at":null,"nameSpace":"mnlcaa/v610","browseCount":126,"collectCount":0,"estimateDate":5,"docStatus":0,"permissions":true,"overView":false}}