You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:50:57