• 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>() {
                    //请求成功时回调
                    @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);
        }
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74

    以上使用了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;
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

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

  • 相关阅读:
    linux创建用户和组、授权、禁止root远程登录、限制SSH的IP登录
    使用C#编写.NET分析器(三)
    2024级199管理类联考之写作
    工厂生产数据实时分析,产品质量高效管控
    【入门Flink】- 02Flink经典案例-WordCount
    java后端分页的多种操作你必须要知道
    角度新奇!第一次看到这样使用MyBatis的,看得我一愣一愣的。
    报错处理:Error: Redis server is running but Redis CLI cannot connect
    美国专线物流详解:美国专线物流有哪些平台
    蓝桥杯备赛第三篇(图论)
  • 原文地址:https://blog.csdn.net/gdvfs12/article/details/133887020