如何在ML Kit Translation中检查翻译模型是否已下载?
问题分析与修正建议
核心问题1:异步操作导致无法获取真实已下载模型列表
你的getAvailableModels方法存在致命逻辑错误:getRemoteModelManager().getDownloadedModels()是异步操作,addOnSuccessListener中的代码会在方法返回availableModels之后才执行。这意味着你返回的列表永远是空的,后续检查逻辑完全无效。
核心问题2:检查逻辑的遍历错误
isLanguageDownloaded方法的循环逻辑有误:遍历过程中只要遇到不匹配的语言,就会将isDownloaded重置为false,哪怕之前已经找到过匹配项。例如列表包含["en", "fr"],检查"en"时,第一次循环设为true,第二次循环到"fr"又设为false,最终返回错误结果。
修正后的代码实现
1. 重构获取已下载模型的方法(用回调处理异步)
异步操作无法直接同步返回结果,我们通过回调接口传递已下载语言列表:
// 定义回调接口 public interface DownloadedModelsCallback { void onModelsLoaded(List<String> languages); void onLoadFailed(Exception e); } public static void getAvailableModels(DownloadedModelsCallback callback) { getRemoteModelManager() .getDownloadedModels(TranslateRemoteModel.class) .addOnSuccessListener(models -> { List<String> availableLanguages = new ArrayList<>(); for (TranslateRemoteModel model : models) { availableLanguages.add(model.getLanguage()); } callback.onModelsLoaded(availableLanguages); }) .addOnFailureListener(callback::onLoadFailed); }
2. 修正语言模型检查逻辑
基于回调方法实现正确的检查逻辑:
public static void checkLanguageDownloaded(String targetLanguage, final DownloadResultCallback callback) { getAvailableModels(new DownloadedModelsCallback() { @Override public void onModelsLoaded(List<String> languages) { // 直接用contains方法判断,简洁高效 boolean isDownloaded = languages.contains(targetLanguage); callback.onCheckResult(isDownloaded); } @Override public void onLoadFailed(Exception e) { Log.d(TAG, "加载已下载模型失败: " + e.getMessage()); callback.onCheckFailed(e); } }); } // 单独定义检查结果的回调 public interface DownloadResultCallback { void onCheckResult(boolean isDownloaded); void onCheckFailed(Exception e); }
额外优化建议
- 避免重复调用
getAvailableModels():原始代码在循环中多次触发异步请求,完全没必要,应该先获取一次列表再做检查。 - 增强错误处理:在
onFailureListener中添加详细日志,方便排查权限、网络等问题。 - 可选:用Kotlin协程简化异步逻辑(如果项目支持Kotlin),可以避免回调嵌套,让代码更简洁。
内容的提问来源于stack exchange,提问作者Ibragim Maltsagov
相关产品推荐
相关产品推荐

