2025-11-20

public class UploadWorker extends Worker {

private static final int MAX_RETRY = 1;
private static final int STAGE1_WEIGHT = 80;
private static final int STAGE2_WEIGHT = 10;
private static final int STAGE3_WEIGHT = 10;

public UploadWorker(@NonNull Context context, @NonNull WorkerParameters params) {
    super(context, params);
}

@NonNull
@Override
public Result doWork() {
    try {
        List<String> localImageUris = getInputData().getStringArrayList("images");

        // ------------ ① 阶段:并发获取结果 (80%) -------------
        List<String> obsLinks = runStageWithRetry(() -> runStage1(localImageUris), STAGE1_WEIGHT);

        // ------------ ② 阶段:merge 请求 (10%) -------------
        String mergeUrl = runStageWithRetry(() -> runStage2(obsLinks), STAGE2_WEIGHT);

        // ------------ ③ 阶段:下载结果文件 (10%) -------------
        boolean success = runStageWithRetry(() -> runStage3(mergeUrl), STAGE3_WEIGHT);

        return success ? Result.success() : Result.failure();

    } catch (Exception e) {
        e.printStackTrace();
        return Result.failure();
    }
}


/** -------------------- 重试包装方法 --------------------- */
private <T> T runStageWithRetry(StageTask<T> task, int weight) throws Exception {
    for (int retry = 0; retry <= MAX_RETRY; retry++) {
        try {
            return task.run();
        } catch (Exception e) {
            if (retry >= MAX_RETRY) throw e; // 最后一次还失败则抛出
        }
    }
    return null;
}


/** -------------------- 阶段1:并发任务 --------------------- */
private List<String> runStage1(List<String> images) throws Exception {
    int total = images.size();
    ExecutorService executor = Executors.newFixedThreadPool(3);
    List<Future<String>> futures = new ArrayList<>();
    List<String> results = new ArrayList<>();

    for (String img : images) {
        futures.add(executor.submit(() -> callPicToWord(img))); // 网络请求方法自己实现
    }

    for (int i = 0; i < futures.size(); i++) {
        String url = futures.get(i).get();
        results.add(url);
        updateProgress((i + 1), total, STAGE1_WEIGHT);
    }

    executor.shutdown();
    return results;
}


/** -------------------- 阶段2:merge 请求 --------------------- */
private String runStage2(List<String> urls) throws Exception {
    String mergeUrl = callMergeWord(urls); // 自己实现
    updateProgress(1, 1, STAGE2_WEIGHT);
    return mergeUrl;
}


/** -------------------- 阶段3:下载保存 --------------------- */
private boolean runStage3(String downloadUrl) throws Exception {
    String base64Word = downloadBase64(downloadUrl); // 网络下载实现
    saveToFile(base64Word); // 保存文件实现
    updateProgress(1, 1, STAGE3_WEIGHT);
    return true;
}


/** -------------------- 进度计算 --------------------- */
private int accumulatedProgress = 0;

private void updateProgress(int current, int total, int weight) {
    int stageProgress = (int) (((float) current / total) * weight);
    int newProgress = accumulatedProgress + stageProgress;

    setProgressAsync(new Data.Builder().putInt("progress", newProgress).build());

    if (current == total) accumulatedProgress += weight;
}


/** -------------------- Functional Interface --------------------- */
interface StageTask<T> {
    T run() throws Exception;
}


/** -------------------- 以下为伪代码方法 --------------------- */

private String callPicToWord(String uri) throws Exception {
    // TODO 网络请求
    return "obs_url_xxx";
}

private String callMergeWord(List<String> list) throws Exception {
    // TODO 网络请求
    return "merge_download_short_link";
}

private String downloadBase64(String shortLink) throws Exception {
    // TODO 下载 base64
    return "BASE64_STRING";
}

private void saveToFile(String base64) throws Exception {
    // TODO 保存本地
}

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 河里的鱼全都飞到了岸上,看着数不尽的鱼,女人高兴坏,心里已经想好,至于该怎么做,回到家当即做了道石板烤鱼,丈夫看到...
    北极的童话阅读 43评论 0 1
  • 真正人品高尚的人,他们的光芒不在于耀眼的成就,而在于灵魂的质地,他们或许沉默,但行动如春风化雨;他们或许平凡,但坚...
    苏苡落阅读 33评论 0 1
  • 云舒老师推荐关注自己的感受 (客观的事实+自己的感受) 好的感受——满足、欣慰、舒适、愉悦、放松、踏实、惬意、安全...
    暖暖的笑21阅读 39评论 0 0
  • 我该怎么说尼? 最近开始越来越爱自己,而且我觉得事情也越来越顺利。 虽然我的体重又要180斤,但这次的我没有沮丧,...
    阳子聊天赋阅读 57评论 0 0
  • 那名叫梅森的陌生人被3楼的神秘女人咬伤了。节哀帮切斯特把梅森秘密送走,罗切斯特告诉简爱不要声张,两人也进行了一次真...
    轻言细语阅读 45评论 0 1

友情链接更多精彩内容