{"version":"0.1.0","code":"0000","result":true,"message":"处理成功","errdetail":"","timestamp":1671516377198,"data":{"id":71712232,"title":"8.2.5.4 下载/更新云端城市数据","slug":"ugngru","format":"lake","bookId":26046811,"body":null,"body_draft":null,"body_html":"

场景图

\"image.png\"

时序图

获取云端城市数据信息

关键参数

com.autonavi.gbl.data.model.OperationType

开始下载(包含下载、更新、重试动作)

com.autonavi.gbl.data.observer.IDownloadObserver

由调用者继承实现,可以添加多个,通常一个即可。下载进度,下载过程中的城市数据状态变化、以及发生错误都是通过该观察者通知回调。

void onDownLoadStatus (@DownLoadMode.DownLoadMode1 int downLoadMode,

@DataType.DataType1 int dataType, int id,

@TaskStatusCode.TaskStatusCode1 int taskCode,

@OperationErrCode.OperationErrCode1 int opCode)

com.autonavi.gbl.data.model.TaskStatusCode

com.autonavi.gbl.data.model.OperationErrCode

void onPercent(@DownLoadMode.DownLoadMode1 int downLoadMode,

@DataType.DataType1 int dataType, int id, int percentType, float percent)

percentType 参数:0-表示下载进度,1-表示解压进度。


备注:请注意IDownloadObserver的生命周期,确保城市数据操作结束之前,请确保观察者不被释放。

核心接口

添加下载状态观察者监听

移除下载状态观察者


以上接口参数downLoadMode,均需传 DOWNLOAD_MODE_NET 值,表示网络更新下载模式。


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

调用示例

public class OptStatus{\n\tstatic final int AUTO_UNKNOWN_ERROR = Integer.MIN_VALUE;\n    static final int OPT_DONE = 0;\t\t\t\t\t\t\t\t\t\t/** 正常 */\n    static final int OPT_NET_DISCONNECT = OPT_DONE + 1;\t\t\t\t\t/** 无网络连接 */\n    static final int OPT_DOWNLOAD_NET_ERROR = OPT_NET_DISCONNECT + 1;\t/** 下载网络异常 */\n    static final int OPT_NO_SPACE_LEFTED = OPT_FIRST_DOWNLOAD + 1;\t\t/** 剩余空间小于阈值  */\n    static final int OPT_SPACE_NOT_ENOUGHT = OPT_NO_SPACE_LEFTED + 1;   /** 下载量可能大于剩余空间  */\n    static final int OPT_ERROR = OPT_SPACE_NOT_ENOUGHT + 1;\t\t\t\t/** 操作异常  */\n}
public class processOptStatus(OptStatus status)\n{\n\tswitch (status)\n    {\n        case OptStatus.OPT_NO_SPACE_LEFTED:\n        {\n            // 1. 暂停正在下载的城市数据\n            MapDataService mapDataService = ServiceMgr.getBLService(SingleServiceID.MapDataSingleServiceID);\n            ArrayList<int> cityAdcodes = getDownloadingCityAdcodes(); // 获取正在下载的城市数据\n            mapDataService.operate(DownLoadMode.DOWNLOAD_MODE_NET, OperationType.OPERATION_TYPE_PAUSE, cityAdcodes);\n            \n            // 2. 前端提示:存储空间不足,请清除空间后重试\n\t\t\tbreak;        \n        }\n        case OptStatus.OPT_SPACE_NOT_ENOUGHT:\n        {\n        \t// 1. 前端提示:存储空间可能不足,是否继续下载?\n            if (keepDownloading) // 继续下载\n            {\n            \t// 获取当前点击的城市数据adcode\n            \tint cityAdcode = getChoosedCityAdcode();\n                ArrayList<int> cityAdcodes;\n                cityAdcodes.add(cityAdcode);\n            \tmapDataService.operate(DownLoadMode.DOWNLOAD_MODE_NET, OperationType.OPER\tqATION_TYPE_START, cityAdcodes);\n            }\n            break;\n        }\n        case OptStatus.OPT_NET_DISCONNECT:\n        {\n        \t// 前端提示例如:无网络连接,请检查网络后重试\n            break;\n        }\n        case OptStatus.OPT_DOWNLOAD_NET_ERROR:\n        {\n        \t// 前端提示例如:网络异常,请检查网络后重试\n            break;\n        }\n    }\n}
public class DownloadObserver implements IDownloadObserver {\n\npublic void onOperated(@DownLoadMode.DownLoadMode1 final int downLoadMode, @DataType.DataType1 final int dataType,\n                           @OperationType.OperationType1 final int opType, final int[] opreatedIdList) {\n    \tif (downLoadMode == DownLoadMode.DOWNLOAD_MODE_NET\n            && dataType == DataType.DATA_TYPE_MAP)\n        {\n            runOnUiThread(new Runnable() {\n                @Override\n                public void run() {\n\t\t\t\t\t// 通知全部数据变更,获取城市数据信息更新UI控件文案信息\n                    updateCityData(); // 备注:如果不想全部更新,可以获取只更更新参数 opreatedIdList 中的城市数据项\n                }\n            });\n        }\n    }\n\n    @Override\n    public void onDownLoadStatus(@DownLoadMode.DownLoadMode1 final int downLoadMode, @DataType.DataType1 final int dataType,\n                                 final int id, @TaskStatusCode.TaskStatusCode1 final int taskCode, @OperationErrCode.OperationErrCode1 final int opCode) {\n        Log.d(TAG, "onDownLoadStatus: downLoadMode = " + downLoadMode + "; dataType = " + dataType + "; taskCode = " +\n                taskCode + "; opCode = " + opCode);\n        runOnUiThread(new Runnable() {\n            @Override\n            public void run() {\n                /** OperationErrCode 处理 */\n\t\t\t\tif (opCode == OperationErrCode.OPERATION_ERR_CODE_NET_NONE){\t// 无网络\n                    // 提示无网络链接toast\n                \tprocessOptStatus(OPT_NET_DISCONNECT);\n                }\n                else if (opCode == OperationErrCode.OPERATION_ERR_CODE_NET_DNS_TIMEOUT\n                        || opCode == OperationErrCode.OPERATION_ERR_CODE_NET_CONNECT_TIMEOUT\n                        || opCode == OperationErrCode.OPERATION_ERR_CODE_NET_SEND_FAILED\n                        || opCode == OperationErrCode.OPERATION_ERR_CODE_NET_RECV_FAILED\n                        || opCode == OperationErrCode.OPERATION_ERROR_CODE_NET_DATA_INVALID){ // 网络异常\n                \t// 提示网络错误toast\n                    processOptStatus(OPT_DOWNLOAD_NET_ERROR);\n                }\n                else if (opCode == OperationErrCode.OPERATION_ERR_CODE_SPACE_UNENOUTH){ // 磁盘空间不足\n                \t// 内存空间不足toast\n                    processOptStatus(OPT_SPACE_NOT_ENOUGHT);\n                }\n                \n                /** TaskStatusCode 处理 */\n                if (TaskStatusCode.TASK_STATUS_CODE_ERR == taskCode \n                    && OperationErrCode.OPERATION_ERR_CODE_SPACE_UNENOUTH != opCode)\n                {\n                \t// 数据下载失败,toast提示下载失败,请重试\n                }\n                \n                /** 通知全部数据变更,获取城市数据信息更新UI控件文案信息 */\n                updateCityData();\t// 备注:如果不想全部更新,可以获取只更更新参数 id 中的城市数据项\n            }\n        });\n    }\n\n    @Override\n    public void onPercent(@DownLoadMode.DownLoadMode1 final int downLoadMode, @DataType.DataType1 final int dataType, final int id,\n                          final int percentType, final float percent) {\n        runOnUiThread(new Runnable() {\n            @Override\n            public void run() {\n                String strMode = new String(downLoadMode == DownLoadMode.DOWNLOAD_MODE_NET ? "网络下载" : "U盘更新");\n                String strDataType = new String("地图数据");\n                \n                MapDataService mapDataService = ServiceMgr.getBLService(SingleServiceID.MapDataSingleServiceID);\n                Area area = new Area();\n                int adcode = id;\n                area = mapDataService.getArea(downLoadMode, adcode);\n                String strPercentType = new String(0 == percentType ? "下载进度" : "解压进度");\n                getPercentData().setText(strMode + "," + strDataType + ","+area.name+","+strPercentType + String.valueOf(percent)+ "%");\n            }\n        });\n    }\n}
protected void onCreate(@Nullable Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    // ... \n    // 进入离线数据下载页面处理初始化逻辑,详细请看《初始化 & 反初始化》文档调用示例\n    // ...\n    MapDataService mapDataService = ServiceMgr.getBLService(SingleServiceID.MapDataSingleServiceID);\n    DownloadObserver downloadObserver = new DownloadObserver();\n    if(null != mapDataService)\n    {\n        mapDataService.addNetDownloadObserver(downloadObserver);\n    }\n}
public void onClick(View v) {\n    switch (v.getId()) {\n        case R.id.btn_download_city_map://下载:\n        case R.id.btn_pause_download:   //暂停\n        case R.id.btn_cancel_download:  //取消\n        case R.id.btn_delete_download:  //删除\n        {\n            int opreationType = OPERATION_TYPE_START;\n            if(v.getId() == R.id.btn_pause_download)\n            {\n                Log.i(TAG, "onClick: btn_pause_download: ");\n                opreationType = OperationType.OPERATION_TYPE_PAUSE;\n            }\n            else if(v.getId() == R.id.btn_cancel_download)\n            {\n                Log.i(TAG, "onClick: btn_cancel_download: ");\n                opreationType = OperationType.OPERATION_TYPE_CANCEL;\n            }\n            else if(v.getId() == R.id.btn_delete_download)\n            {\n                Log.i(TAG, "onClick: btn_delete_download: ");\n                opreationType = OperationType.OPERATION_TYPE_DELETE;\n            }else\n            {\n                Log.i(TAG, "onClick: btn_download_city_map: ");\n                opreationType = OperationType.OPERATION_TYPE_START;\n            }\n\t\t\t\n            // 获取当前点击的城市数据adcode\n            int cityAdcode = getChoosedCityAdcode();\n\n            // 获取城市数据下载项信息\n            MapDataService mapDataService = ServiceMgr.getBLService(SingleServiceID.MapDataSingleServiceID);\n            CityDownLoadItem item = mapDataService.getCityDownLoadItem(DownLoadMode.DOWNLOAD_MODE_NET, cityAdcode);\n            \n            if (TaskStatusCode.TASK_STATUS_CODE_SUCCESS == item.taskState\n               && OperationType.OPERATION_TYPE_CANCEL == opType){\n                // 返回一个错误\n                return TaskStatusCode.OPT_ERROR;\n            }\n            \n            ArrayList<int> cityAdcodes;\n            cityAdcodes.add(cityAdcode);\n            mapDataService.operate(DownLoadMode.DOWNLOAD_MODE_NET, opType, cityAdcodes);\n        }\t\n    }\n}
 protected void onDestroy() {\n        mIMapDataService.removeNetDownloadObserver(downloadObserver);\n        super.onDestroy();\n\t}

备注:进入离线数据页面添加下载观察者,退出离线数据页面移除下载观察者,保证在离线数据操作过程中观察者不被释放。

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