初始化
本章节说明 Android 端 SDK 集成的完整初始化流程,共包含 5 个部分:
| 序号 | 模块 | 入口 | 说明 |
|---|---|---|---|
| 1 | 主 SDK | SDK.getInstance().initialize(...) |
必选,应用启动时完成 |
| 2 | Entity | EntityService.initialize(...) |
按需,主 SDK 成功后调用 |
| 3 | DataCollector | DataCollectorService.initialize(...) |
按需,主 SDK 成功后调用 |
| 4 | NavigationService | NavigationService.Factory.createInstance(...) |
主 SDK 成功后创建;可在主线程或后台线程;退出前 dispose() |
| 5 | MapView | MapView.initialize(...) |
按需,在地图页面中初始化,并绑定页面生命周期 |
1. 前置条件
- 已完成工程搭建与依赖接入
- 已配置
API Key、API Secret、CloudEndPoint - 已准备可写缓存目录(用于
setSdkCacheDataDir) - 若使用 Onboard/Hybrid,已准备本地地图数据目录(用于
setSdkDataDir) setSdkCacheDataDir、setSdkDataDir设置的目录需具备读写权限
2. 初始化顺序
1 2 3 4 5 6 7 8 | |
- 第 1~3 步在 启动页 完成,全局只需初始化一次;建议在后台线程(Worker Thread)执行,避免阻塞主线程。
- 第 4 步在 主 SDK 初始化成功之后 创建;
createInstance可在主线程或后台线程调用(不强制与主 SDK 同线程);可在 Application 或导航相关页面持有一个实例。 - 第 5 步在 包含地图的 Activity / Fragment 的主线程中完成;页面销毁时配合
onPause暂停渲染,避免资源泄漏。
2.1 应用启动初始化示例(后台线程)
主 SDK、Entity、DataCollector 的 initialize 均为耗时操作,建议在 Dispatchers.IO 或独立 Worker Thread 中顺序执行,完成后切回主线程更新 UI。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | |
3. 主 SDK 初始化
主 SDK 负责引擎、地图数据、导航等核心能力,是整个集成的第一步。
入口: SDK.getInstance().initialize(context, navSDKOptions)
返回值: 0 表示成功,非 0 表示失败。
线程要求: 建议在后台线程调用,勿在主线程执行。
关键配置:
| 配置类 | 主要字段 |
|---|---|
SDKOptions |
apiKey、apiSecret、cloudEndPoint、locale、region、sdkCacheDataDir、sdkDataDir |
NavSDKOptions |
交通信息刷新频率、Map Streaming 空间上限、车辆信息 |
完整配置与调用示例见 2.1 应用启动初始化示例(后台线程)。
4. Entity 初始化
Entity 服务提供收藏点、历史记录等实体数据能力。
入口: EntityService.initialize(sdkOptions)
调用时机: 主 SDK 初始化成功后,复用同一份 sdkOptions。
线程要求: 与主 SDK 相同,建议在后台线程调用。
异常处理: 建议捕获 IllegalArgumentException(参数配置错误)与 EntityException(业务初始化失败)。
5. DataCollector 初始化
DataCollector 用于事件采集与上报,为可选模块。
入口: DataCollectorService.initialize(context, sdkOptions)
调用时机: 主 SDK 初始化成功后;若业务不需要数据采集,可跳过。
线程要求: 与主 SDK 相同,建议在后台线程调用。
6. NavigationService 初始化
NavigationService 是路线规划、开始/停止导航、定位回调、沿途信息、语音引导等能力的统一入口。必须在主 SDK initialize 成功之后 再创建。
入口: NavigationService.Factory.createInstance(navigationServiceOptions)
反初始化: navigationService.dispose()(幂等,可重复调用)
线程要求: 须在主 SDK initialize 成功之后调用。createInstance 可在主线程或后台线程执行,无强制线程限制;常与主 SDK 同在后台线程顺序创建,以减少切换,也可在主线程单独创建。
与主 SDK 的关系: NavigationService 为独立 Native 服务实例,不随主 SDK initialize 自动创建;退出或切换账号时,若已创建则须调用 dispose(),且 dispose 之后不得再使用该实例。
6.1 创建示例
1 2 3 4 5 6 7 8 9 10 11 | |
NavigationServiceOptions 的详细配置见开发指南各专题(如 沿途信息、播报、定位 等)。
6.2 反初始化示例
在 导航模块退出、ViewModel.onCleared() 或 应用退出 时释放:
1 2 3 4 5 6 7 8 | |
dispose()会结束当前导航会话、清空eventHub监听并释放底层 DriveSession 资源。dispose之后不得再调用该实例上的任何 API;若仍需导航能力,须重新createInstance。
7. MapView 初始化
MapView 在地图页面中展示地图,必须在主 SDK 初始化成功之后 再调用。
与第 1~3 步不同,MapView 的初始化和销毁与 页面生命周期 强相关:页面可见时渲染,页面不可见时暂停。
7.1 布局配置
在 Activity 或 Fragment 布局中加入 TnMapView:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
7.2 代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |
7.3 生命周期对照
| 页面回调 | MapView 调用 | 作用 |
|---|---|---|
onViewCreated |
initialize(MapViewInitConfig) |
创建地图,绑定 lifecycleOwner |
onResume |
onResume() |
页面进入前台,恢复地图渲染 |
onPause |
onPause() |
页面进入后台,暂停地图渲染 |
initialize与onResume/onPause缺一不可。缺少生命周期转发会导致地图黑屏、卡顿或资源未释放。
MapViewInitConfig 常用参数:
| 参数 | 说明 |
|---|---|
context |
使用 applicationContext,避免 Activity 泄漏 |
lifecycleOwner |
当前 Activity 或 Fragment,用于自动感知生命周期 |
readyListener |
地图就绪后触发,可安全调用各 Controller API |
defaultLocation |
可选,地图初始中心点 |
defaultZoomLevel |
可选,初始缩放级别 |
createCvp |
可选,是否创建默认车标(默认 true) |
8. 释放资源
应用退出或切换账号时释放已初始化的模块(dispose 建议在后台线程执行):
1 2 3 4 5 6 7 8 9 10 11 12 | |
9. 常见问题排查
| 现象 | 排查方向 |
|---|---|
主 SDK initialize 失败 |
检查 Key/Secret、CloudEndPoint、Region 是否匹配 |
| Onboard/Hybrid 无法工作 | 检查 setSdkDataDir 路径是否存在、是否具备读写权限 |
| DataCollector 无数据 | 确认已调用 initialize,且业务侧已触发上报请求 |
| 地图黑屏或卡顿 | 确认主 SDK 已成功初始化;onResume/onPause 是否与页面生命周期配对 |
| 地图 API 调用无效 | 在 readyListener 回调中操作,而非 initialize 调用后立即执行 |
导航 API 抛 NAVIGATION_SERVICE_DISPOSED |
确认未在 NavigationService.dispose() 之后继续调用该实例 |
| 创建 NavigationService 失败 | 确认主 SDK 已成功 initialize |