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

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>() {//请求成功时回调@Overridepublic 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()+"");}}//请求失败时候的回调@Overridepublic 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;}
运行结果:

相关文章:
Android--Retrofit2执行多个请求任务并行,任务结束后执行统一输出结果
场景:后端上传文件接口只支持单个文件上传,而业务需求一次性上传多个图片,因此需要多个上传任务并发进行,拿到所有的返回结果后,才能进行下一个流程。 1、使用Java并发工具 private List<Response<JSONObject>…...
面试算法30:插入、删除和随机访问都是O(1)的容器
题目 设计一个数据结构,使如下3个操作的时间复杂度都是O(1)。 insert(value):如果数据集中不包含一个数值,则把它添加到数据集中。remove(value):如果数据集…...
Qt/C++开源作品45-CPU内存显示控件/和任务管理器一致
一、前言 在很多软件上,会在某个部位显示一个部件,专门显示当前的CPU使用率以及内存占用,方便用户判断当前程序或者当前环境中是否还有剩余的CPU和内存留给程序使用,在不用打开任务管理器或者资源查看器的时候直接得知当前系统的…...
win32汇编-使用子程序
当程序中相同功能的一段代码用得比较频繁时,可以将它分离出来写成一个子程序,在主程序中用call指令来调用它。这样可以不用重复写相同的代码, 仅仅用call指令就可以完成多次同样的工作了。Win 32汇编中的子程序也采用堆栈来传递参数ÿ…...
【论文阅读】 Cola-Dif; An explainable task-specific synthesis network
文章目录 CoLa-Diff: Conditional Latent Diffusion Model for Multi-modal MRI SynthesisAn Explainable Deep Framework: Towards Task-Specific Fusion for Multi-to-One MRI Synthesis CoLa-Diff: Conditional Latent Diffusion Model for Multi-modal MRI Synthesis 论文…...
ShareMouse for Mac(多台电脑鼠标键盘共享软件)
ShareMouse mac版是一款Mac平台上可以在多台电脑间共享鼠标的工具软件,sharemousefor Mac支持 Windows 与 Mac,并可以在不同电脑间共享剪贴板。只需要移动鼠标指针的到想控制的显示器那里去、鼠标光标就会神奇地“跨越”到邻近的电脑屏幕上。每个计算机都…...
中文编程开发语言工具开发案例:多种称重方式编程实际例子
中文编程开发语言工具开发案例:多种称重方式编程实际例子 上图为 计价秤,使用串口通讯线连接电脑的主机,软件自动读取称的重量,自动计算金额。这种方式称重快速,不需再打印条码。 上图这个称重方式为 一体称称重&#…...
国密sm2的Vue、Python、Java互通使用
目录 一、Vue 二、Python 三、Java 一、Vue # npm install --save sm-cryptoimport {sm2} from sm-crypto const cipherMode 1 const private_key d9d37f4f46e8514c6f9398a984e74f3eead994e8f4ac5f92e5deb313cb5ad6a6 const public_key 04 e332ee43ac37be458550652fb9…...
如何通过SK集成chatGPT实现DotNet项目工程化?
智能助手服务 以下案例将讲解如何实现天气插件 当前文档对应src/assistant/Chat.SemanticServer项目 首先我们介绍一下Chat.SemanticServer的技术架构 SemanticKernel 是什么? Semantic Kernel是一个SDK,它将OpenAI、Azure OpenAI和Hugging Face等大…...
DRM中render-node编号的分配
DRM系统 DRM是direct rendering manager的简称。DRM是linux kernel中与负责video cards功能的GPU打交道的子系统。DRM给出了一组API,可以供用户程序来发送命令和数据给GPU设备从而来控制比如display、render等功能。 render-node由来 在以前,DRM子系统…...
将输入对象转换为数组数组的维度大于等于1numpy.atleast_1d()
【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将输入对象转换为数组 数组的维度大于等于1 numpy.atleast_1d() 选择题 使用numpy.atleast_1d()函数,下列正确的是? import numpy as np a1 1 a2 ((1,2,3),(4,5,6)) print("…...
js 删除树状图无用数据,如果子级没有数据则删除
有一个需求,当你从后端拿到一个树状图的时候,有些子级没数据,这时就需要我们处理一下数据,当然了,如果第一层底下的第二层没数据,第二层底下的所有都没数据,那这一层都不需要。 我的写法&#x…...
Docker 容器化(初学者的分享)
目录 一、什么是docker 二、docker的缺陷 三、简单的操作 一、首先配置一台虚拟机 二、安装Docker-CE 一、安装utils 二、 将 Docker 的软件源添加到 CentOS 的 yum 仓库中。这样可以通过 yum 命令来安装、更新和管理 Docker 相关的软件包。 三、将 download.docker.co…...
LCS 01.下载插件
题目来源: leetcode题目,网址:写文章-CSDN创作中心 解题思路: 假设需要 n 分钟下载插件,前 n-1 分钟将带宽加倍,最后一分钟下载时总时间最少。 解题代码: class Solution { public:int l…...
架构-设计原则
1、面向对象的SOLID 1.1 概述 SOLID是5个设计原则开头字母的缩写,其本身就有“稳定的”的意思,寓意是“遵从SOLID原则可以建立稳定、灵活、健壮的系统”。5个原则分别如下: Single Responsibility Principle(SRP)&am…...
在 Python 3 中释放 LightGBM 的力量:您的机器学习大师之路
机器学习是 Python 占据主导地位的领域,它一直在给全球各行各业带来革命性的变化。要在这个不断变化的环境中脱颖而出,掌握正确的工具是关键。LightGBM 就是这样一个工具,它是一个强大且快速的梯度提升框架。在这份综合指南中,我们将通过实际示例和示例数据集从基础知识到高…...
Spring学习笔记(2)
Spring学习笔记(2) 一、Spring配置非定义Bean1.1 DruidDataSource1.2、Connection1.3、Date1.4、SqlSessionFactory 二、Bean实例化的基本流程2.1 BeanDefinition2.2 单例池和流程总结 三、Spring的bean工厂后处理器3.1 bean工厂后处理器入门3.2、注册Be…...
cmd使用ssh连接Linux脚本
前言 在开发过程中,由于MobaXterm,我不知道怎么分页(不是屏内分页),用crtlTab,用起来不习惯,主要是MobaXterm连接了多个服务器,切换起来很麻烦。我是比较习惯使用altTab,…...
Python万圣节蝙蝠
目录 系列文章 前言 蝙蝠 程序设计 程序分析 运行结果 尾声 系列文章 序号文章目录直达链接1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want5…...
TCP流套接字编程
文章目录 前言TCP 和 UDP 的特点对比TcpEchoServer 服务端实现1. 创建 ServerSocket 类实现通信双方建立连接2. 取出建立的连接实现双方通信3. 服务端业务逻辑实现关闭资源服务端整体代码 TcpEchoClient 客户端实现1. 创建出 Socket 对象来与服务端实现通信2. 实现客户端的主要…...
用快马AI一键生成数据库管理原型,告别navicat手工建表写接口
用快马AI一键生成数据库管理原型,告别navicat手工建表写接口 最近在开发一个员工信息管理系统时,我深刻体会到传统数据库管理工具的局限性。虽然navicat这类工具能帮我们可视化操作数据库,但每次新建项目都要手动建表、写接口,重…...
INNISO1接口模块
INNIS01 接口模块INNIS01 是一款应用于工业自动化控制系统中的接口模块,主要用于实现控制系统内部或与外部设备之间的信号连接与数据交互,属于系统中的通信与接口扩展单元。一、基本概述INNIS01 接口模块通常用于连接控制器与现场设备或其他功能模块&…...
3个实战场景×5个核心技巧:Umi-OCR本地化部署与效率提升完全指南
3个实战场景5个核心技巧:Umi-OCR本地化部署与效率提升完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置…...
突破试用限制:开源脚本实现IDM无限使用的完整解决方案
突破试用限制:开源脚本实现IDM无限使用的完整解决方案 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 一、问题引入:IDM用户的痛点与解决…...
国家中小学智慧教育平台电子课本高效解决方案:如何突破资源获取瓶颈?
国家中小学智慧教育平台电子课本高效解决方案:如何突破资源获取瓶颈? 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地…...
快速原型设计:使用快马平台ai一键生成c语言银行系统项目骨架
今天想和大家分享一个快速验证技术方案的小技巧——用InsCode(快马)平台的AI生成功能快速搭建C语言项目原型。最近在准备一个银行系统的课程设计时,发现这个方式特别适合用来做前期技术验证。 为什么需要快速原型 刚开始做课程设计时,最头疼的就是花大量…...
LFM2.5-1.2B-Thinking多场景落地:Ollama支持下的技术博客写作、论文摘要生成案例
LFM2.5-1.2B-Thinking多场景落地:Ollama支持下的技术博客写作、论文摘要生成案例 你是不是也遇到过这样的烦恼:想写一篇技术博客,对着空白的文档发呆半天,不知道从何下笔;或者面对一篇几十页的学术论文,需…...
解锁AI编程新范式:Continue插件的颠覆性开发体验
解锁AI编程新范式:Continue插件的颠覆性开发体验 【免费下载链接】continue ⏩ Source-controlled AI checks, enforceable in CI. Powered by the open-source Continue CLI 项目地址: https://gitcode.com/GitHub_Trending/co/continue 你是否曾在深夜调试…...
MGeo地址实体对齐镜像快速上手:5分钟部署,支持自定义阈值
MGeo地址实体对齐镜像快速上手:5分钟部署,支持自定义阈值 1. 引言:地址数据混乱,是时候换个思路了 你有没有被这样的问题困扰过? 公司CRM系统里,同一个客户因为地址写法不同,被重复记录了十几…...
AlphaFold单元测试:代码质量保证
AlphaFold单元测试:代码质量保证 【免费下载链接】alphafold Open source code for AlphaFold 2. 项目地址: https://gitcode.com/GitHub_Trending/al/alphafold 引言:为什么AlphaFold需要严格的单元测试? AlphaFold作为革命性的蛋白…...
