{"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 二次算路》
备注:主屏支持同步算路数据给其他所有副屏端,下图的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}