如何为ML Kit下载的Digital Ink识别模型显示下载进度?
实现Google Digital Ink模型下载的进度条展示
当然可以实现下载进度的可视化啦!Google ML Kit的RemoteModelManager提供了监听下载进度的接口,咱们只需要添加一个ModelDownloadListener就能实时获取下载的字节数变化,进而更新进度条。
修改后的完整代码
fun download(context: Context, progressBar: ProgressBar) { var modelIdentifier: DigitalInkRecognitionModelIdentifier? = null try { modelIdentifier = DigitalInkRecognitionModelIdentifier.fromLanguageTag(lang) } catch (e: MlKitException) { // 处理语言标签解析失败的情况 Log.e("StrokeManager", "Failed to parse language tag: $e") Toast.makeText(context, "Invalid language tag", Toast.LENGTH_SHORT).show() return } model = DigitalInkRecognitionModel.builder(modelIdentifier!!).build() val remoteModelManager = RemoteModelManager.getInstance() val downloadConditions = DownloadConditions.Builder().build() // 创建下载进度监听器 val downloadListener = object : ModelDownloadListener { override fun onDownloadCompleted(model: RemoteModel) { // 下载完成后移除监听器,避免内存泄漏 remoteModelManager.removeModelDownloadListener(this) Log.i("StrokeManager", "Model downloaded") Toast.makeText(context, "Model Downloaded", Toast.LENGTH_SHORT).show() progressBar.visibility = View.GONE } override fun onDownloadFailed(model: RemoteModel, error: Exception) { remoteModelManager.removeModelDownloadListener(this) Log.e("StrokeManager", "Error while downloading a model: $error") Toast.makeText(context, "Model Download Failed", Toast.LENGTH_SHORT).show() progressBar.visibility = View.GONE } override fun onDownloadProgress(model: RemoteModel, bytesDownloaded: Long, totalBytesToDownload: Long) { // 计算进度百分比并更新进度条 val progressPercent = (bytesDownloaded * 100 / totalBytesToDownload).toInt() progressBar.progress = progressPercent // 可选:添加进度文本提示 // (context as? Activity)?.findViewById<TextView>(R.id.tv_progress)?.text = "已下载${progressPercent}%" } } // 注册监听器并启动下载 remoteModelManager.addModelDownloadListener(downloadListener) remoteModelManager.download(model, downloadConditions) }
关键说明
- 进度条配置:确保你的布局中的
ProgressBar的android:max属性设置为100(默认值就是100,无需额外修改),这样进度百分比可以直接映射到进度条的进度值。 - 内存泄漏防范:在下载完成或失败后,一定要调用
removeModelDownloadListener移除监听器,避免因监听器持有Context引用导致的内存泄漏。 - UI更新安全:ML Kit的监听器回调是在主线程执行的,所以可以直接在
onDownloadProgress中更新进度条和文本,不需要额外切换线程。 - 调用方式:在Activity或Fragment中调用这个方法时,传入布局中的ProgressBar实例即可,比如:
download(this, findViewById(R.id.progress_bar))
内容的提问来源于stack exchange,提问作者kuro
相关产品推荐
相关产品推荐

