整站优化,如何自做网站,分销网站方案,推广网站的几种方法场景#xff1a;后端上传文件接口只支持单个文件上传#xff0c;而业务需求一次性上传多个图片#xff0c;因此需要多个上传任务并发进行#xff0c;拿到所有的返回结果后#xff0c;才能进行下一个流程。 1、使用Java并发工具 private ListResponseJSONObject后端上传文件接口只支持单个文件上传而业务需求一次性上传多个图片因此需要多个上传任务并发进行拿到所有的返回结果后才能进行下一个流程。 1、使用Java并发工具
private ListResponseJSONObject 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);CallJSONObject resultcall api.up_file(e2e5198e198c78cb59cebfadc592aa45, part);resultcall.enqueue(new CallbackJSONObject() {//请求成功时回调Overridepublic void onResponse(CallJSONObject call, ResponseJSONObject 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(CallJSONObject call, Throwable throwable) {XToastUtils.error(throwable.getMessage());}});}private synchronized void handleResponse() {requestCount;if (requestCount mSelectList.size()) {// 所有请求都已完成可以在这里处理合并的结果handleCombinedResponse(responses);}}/*** 处理合并的结果*/private void handleCombinedResponse(ListResponseJSONObject responses) {ListString result new ArrayList();for (ResponseJSONObject 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() {ListCompletableFutureString futures new ArrayList();for (LocalMedia localMedia : mSelectList) {File file new File(localMedia.getPath());CompletableFutureString 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);CallJSONObject resultcall api.up_file(e2e5198e198c78cb59cebfadc592aa45, part);ResponseJSONObject execute resultcall.execute();if(execute.isSuccessful()){return execute.body().getString(data);}} catch (IOException e) {e.printStackTrace();}return null;});futures.add(future);}ListString results new ArrayList();CompletableFutureVoid allOf CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));try {allOf.get();for (CompletableFutureString 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;}
运行结果