{"version":"0.1.0","code":"0000","result":true,"message":"处理成功","errdetail":"","timestamp":1671516403536,"data":{"id":71713938,"title":"17.7.3.2 在线算路一致性","slug":"bn1scr","format":"lake","bookId":26046811,"body":null,"body_draft":null,"body_html":"

场景图

对于开启多屏服务的产品形态,触发在线算路时,主屏HMI发起一次算路请求,主屏HMI和副屏HMI都能收到对应的算路结果回调。算路回调结果中的PathResultData新增planChannelId成员,回调透出的值为发起端设置的SdkName,如果是主屏的话则为"MainSdk",如果是副屏的话则为ChannelInitParam数据结构中的localSdkName参数(主屏不允许设置SdkName,所以主屏内部固化为MainSdk),用于告知本端的HMI本次算路结果回调,对应来自哪一台设备上的算路请求。

简而言之,在线算路,任何一端的HMI发起在线算路请求,所有端的HMI都能收到算路结果回调,不需要除了在线式算路发起端以外的其他端HMI做重复的算路请求。

增加planChannelId的目的,是因为主屏HMI和副屏HMI可能都有做RouteService::requestRoute的操作,每个端之间的RequestRoute得到的requestId有可能重复,在线路线的PathId也有可能重复。如果HMI有根据算路requestId管理路线的业务,在开启多屏服务的产品形态下,不可再只用算路requestId一个值来管理算路结果,需要联合requestId和planChannelId来管理算路结果。

在线算路多屏一致性,暂时只支持合并应答请求。分次应答正在开发中。

合并应答/分次应答的内容参考《5.3.1.1 二次算路》

时序图


●关联文档
TBT服务初始化
算路结果回调

主屏HMI发起算路

备注:主屏支持同步算路数据给其他所有副屏端,下图的AutoSDK_N代表的是所有的副屏端SDK。


副屏HMI发起算路

备注:副B可以延伸代表副屏C、副屏D等等。

特殊情况:屏幕间的启动有先后问题,当其他屏幕算路完成后,后启动的屏幕没有算路信息。

关键参数

com.autonavi.gbl.route.observer.IRouteResultObserver
com.autonavi.gbl.route.model.PathResultData

成员

含义

备注

requestId

算路id

planChannelId

路线规划通道Id

用于标识本次算路结果来源于哪个SDK发起,如果主屏发起的情况则为"MainSdk",如果副屏的情况则为ChannelInitParam数据结构中的localSdkName参数

其余PathResultData的成员,参考《5.3.4 算路结果回调》

核心接口

void com.autonavi.gbl.route.RouteService.addRouteResultObserver(IRouteResultObserver ob)
void com.autonavi.gbl.route.RouteService.removeRouteResultObserver(IRouteResultObserver ob)
void com.autonavi.gbl.route.observer.IRouteResultObserver.onNewRoute(PathResultData pathResultData, ArrayList<PathInfo> pathInfoList, java.lang.Object externData)
void com.autonavi.gbl.route.observer.IRouteResultObserver.onNewRouteError(PathResultData pathResultData, java.lang.Object externData)

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

调用示例

// 算路结果观察者\nIRouteResultObserver routeResultObserver = new IRouteResultObserver() {\n    @Override\n    public void onNewRoute(PathResultData pathResultData, ArrayList<PathInfo> pathInfoList, RouteLimitInfo routeLimitInfo) {\n        ...\n        //一次算路成功回调后做的事情\n        if( FirstRouteResp == pathResultData.routeRespCategory)\n        {\n            //一次算路应答通知\n            //hmi根据pathInfoList上的路线数据信息,描绘完整的路线数据\n            //并保存pathInfoList,用于二次算路结果内容访问\n        }\n        else if( SecondRouteResp == pathResultData.routeRespCategory )\n        {\n            //二次算路应答通知\n            //pathInfoList.size()为0,但是hmi可以使用第一次算路应答的pathInfoList对象中路线上的引导信息\n            \n        }\n        else if(ODDResp == pathResultData.routeRespCategory )\n        {\n            //ODD应答通知\n            //pathInfoList.size()为0,但是hmi可以使用第一次算路应答的pathInfoList对象中路线上的ODD信息\n        }\n        \n        /*\n        PathResultData::planChannelId字段仅仅用于通知HMI,当前算路结果来自于哪个屏幕发起的算路。\n        HMI根据自身业务情况,使用PathResultData::planChannelId进行差异化的实现。\n        比如,有些HMI可能希望使用PathResultData::planChannelId是MainSDK还是RsuSDK把不同来源的路线分开存储。\n        */\n    }\n\n    @Override\n    public void onNewRouteError(PathResultData pathResultData, RouteLimitInfo routeLimitInfo) {\n        ...//算路失败回调后做的事情\n            \n        //一次算路成功回调后做的事情\n        if( FirstRouteResp == pathResultData.routeRespCategory)\n        {\n            //一次算路应答通知\n        }\n        else if( SecondRouteResp == pathResultData.routeRespCategory )\n        {\n            //二次算路应答通知\n        }\n        else if(ODDResp == pathResultData.routeRespCategory )\n        {\n            //ODD应答通知\n        }\n        \n        // 通知guideService算路失败\n        if ((RouteTypeTMC == pathResultData.type) || (RouteTypeLimitLine == pathResultData.type) || (RouteTypeMutiRouteRequest == pathResultData.type) ||\n            (RouteTypeDamagedRoad == pathResultData.type) || (RouteTypeLimitForbid == pathResultData.type) || (RouteTypeLimitForbidOffLine == pathResultData.type)\n            && RouteErrorcodeSlilentRouteNotMeetCriteria == pathResultData.errorCode)\n        {\n            // 静默算路,失败RouteErrorcodeSlilentRouteNotMeetCriteria不需要处理\n        }\n        else\n        {\n            // 通知guideService算路失败\n            guideService.notifyRerouteFail(pathResultData.type);\n        }\n        \n        if(pathResultData.errorCode == RouteErrorcodeNetworkError) {\n            //在线算路失败,内部默认转离线\n            int constrainCode = mRouteOption.getConstrainCode();\n            mRouteOption.setConstrainCode(constrainCode | RouteConstrainCode.RouteCalcLocal);\n            routeService.requestRoute(mRouteOption);\n        } else {\n            // 通知失败\n        }\n    }\n};\n\n// RouteService\nprivate RouteService mRouteService;\n\n// 初始化RouteService\nprivate void initRouteService() {\n    mRouteService = (RouteService) ServiceMgr.getServiceMgrInstance().getBLService(SingleServiceID.RouteSingleServiceID);\n    if (null != mRouteService) {\n        mRouteService.init();\n        mRouteService.addRouteResultObserver(routeResultObserver);  //添加算路结果观察者\n    }\n}\n\n//反初始化RouteService\nprivate void unInitRouteService() {\n    if (null != mRouteService) {\n        mRouteService.removeRouteResultObserver(routeResultObserver);//删除算路结果观察者\n    }\n}

","body_lake":null,"pub_level":null,"status":"0","updated_at":"2022-09-01 08:12:58","deleted_at":null,"nameSpace":"mnlcaa/v610","browseCount":71,"collectCount":0,"estimateDate":11,"docStatus":0,"permissions":true,"overView":false}}