当前位置: 首页 > news >正文

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执行多个请求任务并行,任务结束后执行统一输出结果

场景&#xff1a;后端上传文件接口只支持单个文件上传&#xff0c;而业务需求一次性上传多个图片&#xff0c;因此需要多个上传任务并发进行&#xff0c;拿到所有的返回结果后&#xff0c;才能进行下一个流程。 1、使用Java并发工具 private List<Response<JSONObject>…...

面试算法30:插入、删除和随机访问都是O(1)的容器

题目 设计一个数据结构&#xff0c;使如下3个操作的时间复杂度都是O&#xff08;1&#xff09;。 insert&#xff08;value&#xff09;&#xff1a;如果数据集中不包含一个数值&#xff0c;则把它添加到数据集中。remove&#xff08;value&#xff09;&#xff1a;如果数据集…...

Qt/C++开源作品45-CPU内存显示控件/和任务管理器一致

一、前言 在很多软件上&#xff0c;会在某个部位显示一个部件&#xff0c;专门显示当前的CPU使用率以及内存占用&#xff0c;方便用户判断当前程序或者当前环境中是否还有剩余的CPU和内存留给程序使用&#xff0c;在不用打开任务管理器或者资源查看器的时候直接得知当前系统的…...

win32汇编-使用子程序

当程序中相同功能的一段代码用得比较频繁时&#xff0c;可以将它分离出来写成一个子程序&#xff0c;在主程序中用call指令来调用它。这样可以不用重复写相同的代码&#xff0c; 仅仅用call指令就可以完成多次同样的工作了。Win 32汇编中的子程序也采用堆栈来传递参数&#xff…...

【论文阅读】 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平台上可以在多台电脑间共享鼠标的工具软件&#xff0c;sharemousefor Mac支持 Windows 与 Mac&#xff0c;并可以在不同电脑间共享剪贴板。只需要移动鼠标指针的到想控制的显示器那里去、鼠标光标就会神奇地“跨越”到邻近的电脑屏幕上。每个计算机都…...

中文编程开发语言工具开发案例:多种称重方式编程实际例子

中文编程开发语言工具开发案例&#xff1a;多种称重方式编程实际例子 上图为 计价秤&#xff0c;使用串口通讯线连接电脑的主机&#xff0c;软件自动读取称的重量&#xff0c;自动计算金额。这种方式称重快速&#xff0c;不需再打印条码。 上图这个称重方式为 一体称称重&#…...

国密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 是什么&#xff1f; Semantic Kernel是一个SDK&#xff0c;它将OpenAI、Azure OpenAI和Hugging Face等大…...

DRM中render-node编号的分配

DRM系统 DRM是direct rendering manager的简称。DRM是linux kernel中与负责video cards功能的GPU打交道的子系统。DRM给出了一组API&#xff0c;可以供用户程序来发送命令和数据给GPU设备从而来控制比如display、render等功能。 render-node由来 在以前&#xff0c;DRM子系统…...

将输入对象转换为数组数组的维度大于等于1numpy.atleast_1d()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将输入对象转换为数组 数组的维度大于等于1 numpy.atleast_1d() 选择题 使用numpy.atleast_1d()函数,下列正确的是&#xff1f; import numpy as np a1 1 a2 ((1,2,3),(4,5,6)) print("…...

js 删除树状图无用数据,如果子级没有数据则删除

有一个需求&#xff0c;当你从后端拿到一个树状图的时候&#xff0c;有些子级没数据&#xff0c;这时就需要我们处理一下数据&#xff0c;当然了&#xff0c;如果第一层底下的第二层没数据&#xff0c;第二层底下的所有都没数据&#xff0c;那这一层都不需要。 我的写法&#x…...

Docker 容器化(初学者的分享)

目录 一、什么是docker 二、docker的缺陷 三、简单的操作 一、首先配置一台虚拟机 二、安装Docker-CE 一、安装utils 二、 将 Docker 的软件源添加到 CentOS 的 yum 仓库中。这样可以通过 yum 命令来安装、更新和管理 Docker 相关的软件包。 三、将 download.docker.co…...

LCS 01.下载插件

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;写文章-CSDN创作中心 解题思路&#xff1a; 假设需要 n 分钟下载插件&#xff0c;前 n-1 分钟将带宽加倍&#xff0c;最后一分钟下载时总时间最少。 解题代码&#xff1a; class Solution { public:int l…...

架构-设计原则

1、面向对象的SOLID 1.1 概述 SOLID是5个设计原则开头字母的缩写&#xff0c;其本身就有“稳定的”的意思&#xff0c;寓意是“遵从SOLID原则可以建立稳定、灵活、健壮的系统”。5个原则分别如下&#xff1a; Single Responsibility Principle&#xff08;SRP&#xff09;&am…...

在 Python 3 中释放 LightGBM 的力量:您的机器学习大师之路

机器学习是 Python 占据主导地位的领域,它一直在给全球各行各业带来革命性的变化。要在这个不断变化的环境中脱颖而出,掌握正确的工具是关键。LightGBM 就是这样一个工具,它是一个强大且快速的梯度提升框架。在这份综合指南中,我们将通过实际示例和示例数据集从基础知识到高…...

Spring学习笔记(2)

Spring学习笔记&#xff08;2&#xff09; 一、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脚本

前言 在开发过程中&#xff0c;由于MobaXterm&#xff0c;我不知道怎么分页&#xff08;不是屏内分页&#xff09;&#xff0c;用crtlTab&#xff0c;用起来不习惯&#xff0c;主要是MobaXterm连接了多个服务器&#xff0c;切换起来很麻烦。我是比较习惯使用altTab&#xff0c…...

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. 实现客户端的主要…...

Java多线程实战:ReentrantLock与信号量Semaphore的5个高频使用场景解析

Java多线程实战&#xff1a;ReentrantLock与信号量Semaphore的5个高频使用场景解析 在Java并发编程领域&#xff0c;ReentrantLock和Semaphore是两个至关重要的同步工具。它们虽然都属于JUC&#xff08;java.util.concurrent&#xff09;包中的并发控制机制&#xff0c;但设计理…...

html-to-docx:让HTML转Word不再头疼的开源解决方案

html-to-docx&#xff1a;让HTML转Word不再头疼的开源解决方案 【免费下载链接】html-to-docx HTML to DOCX converter 项目地址: https://gitcode.com/gh_mirrors/ht/html-to-docx 在数字化办公的浪潮中&#xff0c;文档格式转换已成为企业和个人的日常需求。据行业调研…...

Qwen3.5-2B边缘部署教程:ARM架构服务器上运行多模态模型详细步骤

Qwen3.5-2B边缘部署教程&#xff1a;ARM架构服务器上运行多模态模型详细步骤 1. 引言 Qwen3.5-2B是阿里云推出的轻量化多模态基础模型&#xff0c;属于Qwen3.5系列的小参数版本&#xff08;20亿参数&#xff09;。这款模型主打低功耗、低门槛部署&#xff0c;特别适配端侧和边…...

Ant Design X:AI赋能前端开发的革命性工具

1. Ant Design X&#xff1a;当设计系统遇上AI会发生什么&#xff1f; 第一次听说Ant Design X时&#xff0c;我正在为一个电商项目焦头烂额地调试聊天机器人组件。传统方案需要自己对接NLP服务、处理对话状态、设计交互逻辑...直到同事扔给我一个链接&#xff1a;"试试这…...

3张表搞定财务BP工作!财务BP必须会的3张表

做了这么多年财务数据分析&#xff0c;我发现国内很多公司的财务BP&#xff0c;还停留在自己造表的阶段。每人一套表&#xff0c;格式五花八门&#xff0c;数据口径对不上。结果就是BP花大量时间在拉表、对数的琐事上&#xff0c;真正花在业务分析和决策支持上的时间少之又少。…...

别再乱选ASCII/HEX了!野火串口调试助手发送接收区配置详解(附实战案例)

串口通信调试实战&#xff1a;ASCII与HEX模式的选择艺术 调试智能家居设备时&#xff0c;你是否遇到过发送"ON"指令毫无反应&#xff0c;接收区却显示一堆乱码的尴尬&#xff1f;这往往不是设备故障&#xff0c;而是串口调试中最常见的模式选择错误。作为嵌入式开发者…...

快速部署Python3.10环境:Miniconda镜像实战教学

快速部署Python3.10环境&#xff1a;Miniconda镜像实战教学 1. 为什么选择Miniconda搭建Python环境&#xff1f; 在Python开发中&#xff0c;最让人头疼的问题之一就是环境管理。不同项目可能需要不同版本的Python和依赖库&#xff0c;直接安装会导致版本冲突。Miniconda提供…...

BI 项目交付 SOP

...

火影AI绘画实战:用忍者绘卷Z-Image Turbo生成鸣人、佐助角色图教程

火影AI绘画实战&#xff1a;用忍者绘卷Z-Image Turbo生成鸣人、佐助角色图教程 1. 教程概述与准备工作 如果你是火影忍者的粉丝&#xff0c;现在可以通过AI技术轻松生成你最喜欢的角色图像。本教程将带你使用"忍者绘卷Z-Image Turbo"这个专门为火影风格优化的AI绘画…...

SSM+JSP洪涝灾情应急物资管理系统源码+论文

代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 分享万套开题报告任务书答辩PPT模板 作者完整代码目录供你选择&#xff1a; 《SpringBoot网站项目》1800套 《SSM网站项目》1500套 《小程序项目》1600套 《APP项目》1500套 《Python网站项目》…...