Android--Retrofit2执行多个请求任务并行,任务结束后执行统一输出结果

news2025/1/25 4:33:40

场景:后端上传文件接口只支持单个文件上传,而业务需求一次性上传多个图片,因此需要多个上传任务并发进行,拿到所有的返回结果后,才能进行下一个流程。

在这里插入图片描述

1、使用Java并发工具


    private List<Response<JSONObject>> responses = new ArrayList<>();
    private int requestCount = 0;
    
    private void submitTest() {
        for (LocalMedia localMedia : mSelectList) {
            uploadImage(new File(localMedia.getPath()));
        }
    }
    private void uploadImage(File file) {
            JSONObject data = new JSONObject();
            data.put("file",file);
            RequestBody imageBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
            MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), imageBody);
            HttpApi api= RetrofitManager.initRetrofit(RetrofitManager.url_fms).create(HttpApi.class);

            Call<JSONObject> resultcall = api.up_file("e2e5198e198c78cb59cebfadc592aa45", part);
            resultcall.enqueue(new Callback<JSONObject>() {
                //请求成功时回调
                @Override
                public void onResponse(Call<JSONObject> call, Response<JSONObject> response) {
                    if(response.isSuccessful()){
                        JSONObject json = response.body();
                        if(json.getBoolean("flag")){
                            responses.add(response);
                            handleResponse();
                        }else{
                            XToastUtils.error(json.getString("message"));
                        }
                    }else {
                        XToastUtils.error(response.message()+"");
                    }
                }
                //请求失败时候的回调
                @Override
                public void onFailure(Call<JSONObject> call, Throwable throwable) {
                    XToastUtils.error(throwable.getMessage()+"");
                }
            });


    }
    
    private synchronized void handleResponse() {
        requestCount++;
        if (requestCount == mSelectList.size()) {
            // 所有请求都已完成,可以在这里处理合并的结果
            handleCombinedResponse(responses);
        }
    }

  	/**
     * 处理合并的结果
     */
    private void handleCombinedResponse(List<Response<JSONObject>> responses) {
        List<String> result = new ArrayList<>();
        for (Response<JSONObject> response : responses){
            if(response.isSuccessful()){
                JSONObject json = response.body();
                if(json.getBoolean("flag")){
                    XToastUtils.success(json.getString("message"));
                    result.add(json.getString("data"));
                }else{
                    XToastUtils.error(json.getString("message"));
                }
            }else {
                XToastUtils.error(response.message()+"");
            }
        }
        System.out.println(result);
    }



以上使用了synchronized关键字来确保在多线程环境中handleResponse()方法能够正确地计数并处理响应。

运行结果:
在这里插入图片描述

2.使用CompletableFuture来实现

public String performParallelRequests() {
        List<CompletableFuture<String>> futures = new ArrayList<>();
        for (LocalMedia localMedia : mSelectList) {
            File file = new File(localMedia.getPath());
            CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
                try {
                    // 执行第一个请求
                    JSONObject data = new JSONObject();
                    data.put("file",file);
                    RequestBody imageBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
                    MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), imageBody);
                    HttpApi api= RetrofitManager.initRetrofit(RetrofitManager.url_fms).create(HttpApi.class);

                    Call<JSONObject> resultcall = api.up_file("e2e5198e198c78cb59cebfadc592aa45", part);
                    Response<JSONObject> execute = resultcall.execute();
                    if(execute.isSuccessful()){
                        return execute.body().getString("data");

                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            });
            futures.add(future);
        }
        List<String> results = new ArrayList<>();
        CompletableFuture<Void> allOf = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
        try {
            allOf.get();
            for (CompletableFuture<String> future : futures) {
                String result = future.get();
                results.add(result);
                System.out.println(result);
            }
            System.out.println("results---------"+results);
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return null;
    }

运行结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1101682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM三色标记

三色标记 什么是三色标记法 三色标记法&#xff0c;也被称为Tri-color Marking Algorithm&#xff0c;是一种用于追踪对象存活状态的垃圾回收算法。它基于William D. Hana和Mark S. McCulleghan在1976年提出的两色标记法的基础上进行了改进。 与两色标记法只能将对象标记为“…

c++ --- 归并排序

2、归并排序 步骤&#xff1a; 选取中间点 mid (LR)/2递归排序 左边left 和 右边 right归并 ---- 将数组合二为一 模板代码 int temp[10]; void merge_sort(int q[], int l, int r) {//如果左右边界相等 直接退出if (l > r) return;//获取数组中心int mid (l r) / 2;/…

如何将模型原点设置到模型的中心

1、为什么要调整坐标原点位置&#xff1f; 从事3D建模相关工作的朋友们在工作中经常会需要调整模型的坐标原点&#xff0c;那么为什么一定要调整模型的坐标原点呢&#xff1f;主要原因如下&#xff1a; 方便后续操作&#xff1a;将原点设置为几何中心可以方便后续对模型进行旋…

香港主机免备案吗?为什么不用备案?

​  对于许多人来说&#xff0c;选择一个合适的主机是建立网站的重要一步。而在选择主机时&#xff0c;备案问题往往成为了一个让人头疼的难题。有幸的是&#xff0c;香港主机免备案&#xff0c;成为了不少网站建设者的首选。 那么&#xff0c;为什么香港主机不需要备案呢?我…

会议OA小程序首页布局

目录 一. Flex布局介绍 1.1 什么是Flex布局 1.2 基本概念 1.3 Flex属性 二. 会议OA首页轮播图的实现 配置 Mock工具 swiper 效果展示 三. 会议OA首页会议信息布局 index.js index.wxml index.wxss 首页整体效果展示 一. Flex布局介绍 布局的传统解决方案&#x…

LeetCode09——回文数

LeetCode09 自己写的解,转化为字符串再反转&#xff0c;比较笨。 import java.util.Scanner; public class Result01 {public static void main(String[] args) {System.out.println("请输入整数&#xff0c;我来帮您判断是否是回文数。");Scanner scanner new Sc…

2024年孝感市建筑类中级职称申报资料私企VS国企

2024年孝感市建筑类中级职称申报资料私企VS国企 民营企业中级职称申报跟事业单位或者是国企申报中级职称流程不一样么&#xff1f;实际上流程基本都是相同的&#xff0c;就是提交纸质版资料有点不一样。 孝感市建筑类中级职称申报基本流程 1.参加建筑类中级职称水平能力测试。 …

playwright: local variable ‘page‘ referenced before assignment

安装好playwright后&#xff0c;运行相关程序出现此错误&#xff0c;按照下述链接中的方法安装相关组件和浏览器驱动后&#xff0c;问题得以解决。 https://www.cnblogs.com/fengyangsheng/p/17531254.html安装playwright pip install -i https://mirrors.aliyun.com/pypi/si…

“视频剪辑:用马赛克巧妙遮盖水印,让你的视频更完美

想象一下&#xff0c;你正在欣赏一个精彩纷呈的视频&#xff0c;突然间&#xff0c;一个不和谐的水印闯入视线&#xff0c;打破了画面的和谐。是不是瞬间影响了你的观影体验&#xff1f;那么&#xff0c;如何巧妙地解决这个问题呢&#xff1f;今天&#xff0c;我们就来探讨一下…

JavaSE入门---认识运算符

文章目录 算术运算符关系运算符逻辑运算符位运算符移位运算符条件运算符运算符的优先级 计算机的最基本的用途之一就是执行数学运算&#xff0c;运算过程中就会用到运算符&#xff0c;那什么是运算符呢&#xff1f; 即&#xff1a;对操作数进行操作的符号&#xff0c;不同运算符…

《小狗钱钱》阅读笔记(三)

目录 还会有各种各样的人取笑你&#xff0c;但也会有更多的人认可你 有的时候&#xff0c;疯狂的念头比普通的小目标更容易达到。当你定下大目标的时候&#xff0c;就意味着你必须付出比别人多得多的努力。 可是请你告诉我&#xff0c;你为什么不能因为做了一件自己喜欢的事…

功夫猫小游戏

欢迎来到程序小院 功夫猫 玩法&#xff1a; 对准对方猫点击鼠标左键进行扑街&#xff0c;碰到敌方猫扑街X1&#xff0c;不要让对方猫碰到自己&#xff0c;统计扑街次数&#xff0c;快去玩功夫猫吧^^。开始游戏https://www.ormcc.com/play/gameStart/189 html <canvas id&q…

Linux 的常用命令大全

常用命令 ls:查看目录与文件pwd:显示当前目录cd:切换目录绝对路径与相对路径touch:创建空文件tab :补全ctrl c :重新输入cat:查看文件内容mkdir:创建目录rm:删除cp:拷贝mv:移动或重命名文件和目录man:帮助命令lessheadtailvim:文本编辑grep:搜索指定文本模式或正则表达式ps:显…

视频监控/安防监控平台EasyCVR(V.3.4.0)界面更新大曝光,速来抢先看!

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频监控平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录…

注意! Salesforce CTA认证流程已发生变化,技术架构师认证更简单了么?

对于Salesforce从业者来说&#xff0c;跟上生态系统中的持续变化不仅是必要的&#xff0c;而且是保持竞争力的重要组成部分。 如果你正在努力成为Salesforce认证技术架构师 (CTA)&#xff0c;或者是对Salesforce不断发展的认证流程感兴趣&#xff0c;你可能已经听说了CTA评审委…

Android12之报错 error: BUILD_COPY_HEADERS is obsolete(一百六十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

DVD复制软件 DVD-Cloner 2023 mac中文版软件介绍

DVD-Cloner mac是一款备受赞誉的DVD复制软件&#xff0c;用于将DVD光盘上的内容复制到计算机或其他空白DVD光盘上。它提供了强大而易于使用的工具和功能&#xff0c;使用户能够轻松地备份、克隆和烧录DVD。 DVD-Cloner具有直观的用户界面&#xff0c;使用户可以快速上手并进行操…

10-k8s-身份认证与鉴权

文章目录 一、ServiceAccount介绍二、ServiceAccount相关的资源对象三、dashboard空间示例 一、ServiceAccount介绍 ServiceAccount&#xff08;服务账户&#xff09;概念介绍 1&#xff09;ServiceAccount是Kubernetes集群中的一种资源对象&#xff0c;用于为Pod或其他资源提供…