From 94c235c116ebca594662417b5fb2c7378f326c6b Mon Sep 17 00:00:00 2001 From: zuoxiao <470321431@qq.com> Date: 星期三, 08 一月 2025 18:12:31 +0800 Subject: [PATCH] 1.优化上传相关代码。 2.修复多个文件上传时进度条显示异常。 --- app/src/main/java/com/dayu/pipirrapp/adapter/AddPictureAdapter.java | 2 app/src/main/java/com/dayu/pipirrapp/tool/FileUploadUtils.java | 92 +++++++++++++++++- app/src/main/java/com/dayu/pipirrapp/net/ApiManager.java | 12 + app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java | 66 +----------- app/src/main/java/com/dayu/pipirrapp/net/RetrofitClient.java | 2 app/src/main/java/com/dayu/pipirrapp/activity/AddIssueActivity.java | 68 +------------ 6 files changed, 108 insertions(+), 134 deletions(-) diff --git a/app/src/main/java/com/dayu/pipirrapp/activity/AddIssueActivity.java b/app/src/main/java/com/dayu/pipirrapp/activity/AddIssueActivity.java index dea3805..aabd05c 100644 --- a/app/src/main/java/com/dayu/pipirrapp/activity/AddIssueActivity.java +++ b/app/src/main/java/com/dayu/pipirrapp/activity/AddIssueActivity.java @@ -147,7 +147,7 @@ @Override public void onReUpload(UplodFileState uplodFileState) { - uplodeImg(uplodFileState); + FileUploadUtils.uploadFile(AddIssueActivity.this, uplodFileState, uplodFileStates, mAdapter); } }); binding.dealButton.setOnClickListener(v -> { @@ -241,14 +241,6 @@ * @param result */ private void analyticalSelectResults(ArrayList<LocalMedia> result) { - //鑾峰彇褰撳墠uplodFileStates鎵�鏈夌殑鍥剧墖鍦板潃 - Set<String> existingPaths = new HashSet<>(); - for (UplodFileState uplodData : uplodFileStates.values()) { - existingPaths.add(uplodData.getFilePath()); - } - //鑾峰彇鍦≒ictureSelector鐨勭浉鍐屾椂鍙栨秷閫変腑鐨勫浘鐗� - Set<String> resultPaths = new HashSet<>(); - for (LocalMedia media : result) { if (media.getWidth() == 0 || media.getHeight() == 0) { if (PictureMimeType.isHasImage(media.getMimeType())) { @@ -278,63 +270,15 @@ Log.i(TAG, "鏂囦欢澶у皬: " + PictureFileUtils.formatAccurateUnitFileSize(media.getSize())); Log.i(TAG, "鏂囦欢鏃堕暱: " + media.getDuration()); Log.i(TAG, "鎵╁睍鍚�: " + media.getMimeType()); - String compressPath = media.getCompressPath(); - //鍒ゆ柇鏄惁鏈夎繖涓矾寰勶紝娌℃湁鐨勮瘽涓婁紶璇ュ浘鐗囧苟娣诲姞uplodFileStates涓� - if (TextUtils.isEmpty(compressPath)) { - compressPath = media.getRealPath(); - } - if (!existingPaths.contains(compressPath)) { - UplodFileState uplodFileState = new UplodFileState(); - uplodFileState.setFilePath(compressPath); - if (compressPath.toLowerCase().endsWith(".mp4") || compressPath.toLowerCase().endsWith(".avi") || compressPath.toLowerCase().endsWith(".mkv") || compressPath.toLowerCase().endsWith(".mov")) { - // 杩欐槸瑙嗛鏂囦欢 - uplodFileState.setUploadType(UplodFileState.VIDEO_TYPE); - } else { - uplodFileState.setUploadType(UplodFileState.IMG_TYPE); - } - uplodFileState.setExtName(media.getMimeType()); - uplodFileStates.put(compressPath, uplodFileState); - // 鎵ц涓婁紶鍥剧墖鐨勬搷浣� - uplodeImg(uplodFileState); - } - resultPaths.add(media.getCompressPath()); + FileUploadUtils.creatAndUploadFile(this, media, uplodFileStates, mAdapter); } - //澶勭悊浠庣浉鍐岃繑鍥炴椂鍙栨秷鐨勫浘鐗囧鐞� - existingPaths.removeAll(resultPaths); - if (!existingPaths.isEmpty()) { - List<UplodFileState> toRemove = new ArrayList<>(); - for (String path : existingPaths) { - for (UplodFileState uplodFileState : uplodFileStates.values()) { - if (path.equals(uplodFileState.getFilePath())) { - uplodFileState.getThisCall().cancel(); - toRemove.add(uplodFileState); - } - } - } - for (UplodFileState removeFile : toRemove) { - uplodFileStates.remove(removeFile.getFilePath()); - } - } - runOnUiThread(new Runnable() { - @Override - public void run() { - boolean isMaxSize = result.size() == mAdapter.getSelectMax(); - int oldSize = mAdapter.getData().size(); - mAdapter.notifyItemRangeRemoved(0, isMaxSize ? oldSize + 1 : oldSize); - mAdapter.getData().clear(); - mAdapter.getData().addAll(result); - mAdapter.notifyItemRangeInserted(0, result.size()); - - } - }); + // 鑾峰彇 result 涓病鏈夎�� uplodFileStates 涓湁鐨勫湴鍧� + FileUploadUtils.cancelRemovedUploads(result, uplodFileStates); + // 鏇存柊UI + FileUploadUtils.updateUI(result, mAdapter); } - - //涓婁紶鍥剧墖 - private void uplodeImg(UplodFileState uplodFileState) { - FileUploadUtils.uploadFile(this, uplodFileState, uplodFileStates, mAdapter); - } /** * 涓婃姤澶勭悊缁撴灉 diff --git a/app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java b/app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java index fef6b3d..161f6d3 100644 --- a/app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java +++ b/app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java @@ -148,8 +148,7 @@ @Override public void onReUpload(UplodFileState uplodFileState) { - uplodFileState.setState(UplodFileState.STATE_UPDING); - uplodeImg(uplodFileState); + FileUploadUtils.uploadFile(OrderDealActivity.this, uplodFileState, uplodFileStates, mAdapter); } }); binding.dealButton.setOnClickListener(v -> { @@ -235,13 +234,6 @@ * @param result */ private void analyticalSelectResults(ArrayList<LocalMedia> result) { - //鑾峰彇褰撳墠uplodFileStates鎵�鏈夌殑鍥剧墖鍦板潃 - Set<String> existingPaths = new HashSet<>(); - for (UplodFileState uplodData : uplodFileStates.values()) { - existingPaths.add(uplodData.getFilePath()); - } - //鑾峰彇鍦≒ictureSelector鐨勭浉鍐屾椂鍙栨秷閫変腑鐨勫浘鐗� - Set<String> resultPaths = new HashSet<>(); for (LocalMedia media : result) { if (media.getWidth() == 0 || media.getHeight() == 0) { if (PictureMimeType.isHasImage(media.getMimeType())) { @@ -270,60 +262,16 @@ Log.i(TAG, "瑁佸壀瀹介珮: " + media.getCropImageWidth() + "x" + media.getCropImageHeight()); Log.i(TAG, "鏂囦欢澶у皬: " + PictureFileUtils.formatAccurateUnitFileSize(media.getSize())); Log.i(TAG, "鏂囦欢鏃堕暱: " + media.getDuration()); - String compressPath = media.getCompressPath(); - //鍒ゆ柇鏄惁鏈夎繖涓矾寰勶紝娌℃湁鐨勮瘽涓婁紶璇ュ浘鐗� - if (TextUtils.isEmpty(compressPath)) { - compressPath = media.getRealPath(); - } - if (!existingPaths.contains(compressPath)) { - UplodFileState uplodFileState = new UplodFileState(); - uplodFileState.setFilePath(compressPath); - if (compressPath.toLowerCase().endsWith(".mp4") || compressPath.toLowerCase().endsWith(".avi") || compressPath.toLowerCase().endsWith(".mkv") || compressPath.toLowerCase().endsWith(".mov")) { - // 杩欐槸瑙嗛鏂囦欢 - uplodFileState.setUploadType(UplodFileState.VIDEO_TYPE); - }else { - uplodFileState.setUploadType(UplodFileState.IMG_TYPE); - } - uplodFileStates.put(compressPath, uplodFileState); - // 鎵ц涓婁紶鍥剧墖鐨勬搷浣� - uplodeImg(uplodFileState); - } - - resultPaths.add(media.getCompressPath()); + Log.i(TAG, "鎵╁睍鍚�: " + media.getMimeType()); + FileUploadUtils.creatAndUploadFile(this, media, uplodFileStates, mAdapter); } - //澶勭悊浠庣浉鍐岃繑鍥炴椂鍙栨秷鐨勫浘鐗囧鐞� - existingPaths.removeAll(resultPaths); - if (!existingPaths.isEmpty()) { - List<UplodFileState> toRemove = new ArrayList<>(); - for (String path : existingPaths) { - for (UplodFileState uplodFileState : uplodFileStates.values()) { - if (path.equals(uplodFileState.getFilePath())) { - uplodFileState.getThisCall().cancel(); - toRemove.add(uplodFileState); - } - } - } - for (UplodFileState removeFile : toRemove) { - uplodFileStates.remove(removeFile.getFilePath()); - } - } - runOnUiThread(() -> { - boolean isMaxSize = result.size() == mAdapter.getSelectMax(); - int oldSize = mAdapter.getData().size(); - mAdapter.notifyItemRangeRemoved(0, isMaxSize ? oldSize + 1 : oldSize); - mAdapter.getData().clear(); - - mAdapter.getData().addAll(result); - mAdapter.notifyItemRangeInserted(0, result.size()); - - }); + // 鑾峰彇 result 涓病鏈夎�� uplodFileStates 涓湁鐨勫湴鍧� + FileUploadUtils.cancelRemovedUploads(result, uplodFileStates); + // 鏇存柊UI + FileUploadUtils.updateUI(result, mAdapter); } - //涓婁紶鍥剧墖 - private void uplodeImg(UplodFileState uplodFileState) { - FileUploadUtils.uploadFile(this, uplodFileState, uplodFileStates, mAdapter); - } /** * 涓婃姤澶勭悊缁撴灉 diff --git a/app/src/main/java/com/dayu/pipirrapp/adapter/AddPictureAdapter.java b/app/src/main/java/com/dayu/pipirrapp/adapter/AddPictureAdapter.java index 7302fde..f826c32 100644 --- a/app/src/main/java/com/dayu/pipirrapp/adapter/AddPictureAdapter.java +++ b/app/src/main/java/com/dayu/pipirrapp/adapter/AddPictureAdapter.java @@ -168,6 +168,7 @@ ? fileStates.get(media.getRealPath()) : fileStates.get(media.getCompressPath()); if (uplodFileState != null) { + MyLog.d("progressRequestBodyHolder>>>" + "path:" + uplodFileState.getFilePath() + ">>>position:" + position); uplodFileState.setAdapterPosition(position); MyLog.d("progressRequestBodyHolder>>>" + "State:" + uplodFileState.getState() + ">>>position:" + position + ">>>Progress: " + uplodFileState.getProgress()); @@ -178,7 +179,6 @@ viewHolder.maskLayerBg.setVisibility(View.VISIBLE); viewHolder.circleProgressView.setVisibility(View.VISIBLE); viewHolder.circleProgressView.setProgress(uplodFileState.getProgress()); - } else { viewHolder.circleProgressView.setVisibility(View.GONE); viewHolder.maskLayerBg.setVisibility(View.GONE); diff --git a/app/src/main/java/com/dayu/pipirrapp/net/ApiManager.java b/app/src/main/java/com/dayu/pipirrapp/net/ApiManager.java index 7e5671c..742f9d3 100644 --- a/app/src/main/java/com/dayu/pipirrapp/net/ApiManager.java +++ b/app/src/main/java/com/dayu/pipirrapp/net/ApiManager.java @@ -63,6 +63,7 @@ //鏂囦欢涓婁紶澶辫触閲嶅娆℃暟 int uplodFilerepeatSize = 3; + ApiService apiService; // 绠$悊璁㈤槄浜嬩欢 private final CompositeDisposable compositeDisposable = new CompositeDisposable(); @@ -302,7 +303,7 @@ public void uploadFile(final Context context, final UplodFileState uplodData, final UploadFileListener listener, final AddPictureAdapter adapter) { if (!TextUtils.isEmpty(uplodData.getFilePath())) { - MyLog.d("progressRequestBody>>>" + "path:" + uplodData.getFilePath()+">>>uploadType:"+uplodData.getUploadType()); + MyLog.d("progressRequestBody_uploadFile>>>" + "path:" + uplodData.getFilePath() + ">>>uploadType:" + uplodData.getUploadType()); uplodData.setState(STATE_UPDING); File file = new File(uplodData.getFilePath()); RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file); @@ -312,12 +313,15 @@ int progress = (int) (100 * bytesWritten / contentLength); // 渚嬪锛氭洿鏂� ProgressBar 鎴栨樉绀鸿繘搴� runOnUiThread(() -> { - uplodData.setProgress(progress); // 杩涘害鏉℃洿鏂颁唬鐮� if (adapter != null && uplodData.getAdapterPosition() != -1) { - adapter.updateProgress(uplodData); + //浼樺寲涓嶉绻佹洿鏂拌繘搴� + if (progress - uplodData.getProgress() > 5 || progress == 100){ + uplodData.setProgress(progress); + adapter.updateProgress(uplodData); + } } - MyLog.d("progressRequestBody>>>" + "adapterPosition:" + uplodData.getAdapterPosition() + ">>>涓婁紶杩涘害: " + progress + "%"); + MyLog.d("progressRequestBodyHolder>>>path" + "adapterPosition:" + uplodData.getAdapterPosition() + ">>>涓婁紶杩涘害: " + progress + "%"); }); }); diff --git a/app/src/main/java/com/dayu/pipirrapp/net/RetrofitClient.java b/app/src/main/java/com/dayu/pipirrapp/net/RetrofitClient.java index 2464493..c0cdaee 100644 --- a/app/src/main/java/com/dayu/pipirrapp/net/RetrofitClient.java +++ b/app/src/main/java/com/dayu/pipirrapp/net/RetrofitClient.java @@ -1,8 +1,6 @@ package com.dayu.pipirrapp.net; -import com.dayu.pipirrapp.BuildConfig; - import java.util.concurrent.TimeUnit; import okhttp3.OkHttpClient; diff --git a/app/src/main/java/com/dayu/pipirrapp/tool/FileUploadUtils.java b/app/src/main/java/com/dayu/pipirrapp/tool/FileUploadUtils.java index 5755332..6803845 100644 --- a/app/src/main/java/com/dayu/pipirrapp/tool/FileUploadUtils.java +++ b/app/src/main/java/com/dayu/pipirrapp/tool/FileUploadUtils.java @@ -1,13 +1,18 @@ package com.dayu.pipirrapp.tool; +import static com.luck.picture.lib.thread.PictureThreadUtils.runOnUiThread; + import android.content.Context; +import android.text.TextUtils; import com.dayu.pipirrapp.adapter.AddPictureAdapter; import com.dayu.pipirrapp.bean.net.UplodFileState; import com.dayu.pipirrapp.net.ApiManager; import com.dayu.pipirrapp.net.BaseResponse; -import com.dayu.pipirrapp.net.upload.UploadFileListener; +import com.luck.picture.lib.entity.LocalMedia; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import retrofit2.Call; @@ -38,21 +43,96 @@ } /** - * 褰撳叧闂璦ctivity鏃跺叧闂墍鏈夎姹� + * 褰撳叧闂璦ctivity鏃跺叧闂墍鏈夎姹� + * * @param uplodFileStates */ - public static void cancelAllCall(Map<String, UplodFileState> uplodFileStates){ + public static void cancelAllCall(Map<String, UplodFileState> uplodFileStates) { try { - for(UplodFileState uplodFileState:uplodFileStates.values()){ - Call<BaseResponse> mCall =uplodFileState.getThisCall(); + for (UplodFileState uplodFileState : uplodFileStates.values()) { + Call<BaseResponse> mCall = uplodFileState.getThisCall(); if (mCall != null) { mCall.cancel(); } } } catch (Exception e) { - e.printStackTrace(); + e.printStackTrace(); } } + // 鏇存柊UI + public static void updateUI(ArrayList<LocalMedia> result, AddPictureAdapter mAdapter) { + runOnUiThread(() -> { + boolean isMaxSize = result.size() == mAdapter.getSelectMax(); + int oldSize = mAdapter.getData().size(); + mAdapter.notifyItemRangeRemoved(0, isMaxSize ? oldSize + 1 : oldSize); + mAdapter.getData().clear(); + mAdapter.getData().addAll(result); + mAdapter.notifyItemRangeInserted(0, result.size()); + }); + } + + public static void cancelRemovedUploads(ArrayList<LocalMedia> result, Map<String, UplodFileState> uplodFileStates) { + List<String> pathsToRemove = new ArrayList<>(); + for (UplodFileState uplodFileState : uplodFileStates.values()) { + String filePath = uplodFileState.getFilePath(); + // 妫�鏌� result 涓槸鍚﹀寘鍚鏂囦欢璺緞 + boolean isInResult = false; + for (LocalMedia media : result) { + String compressPath = media.getCompressPath(); + //鍒ゆ柇鏄惁鏈夎繖涓矾寰勶紝娌℃湁鐨勮瘽涓婁紶璇ュ浘鐗囧苟娣诲姞uplodFileStates涓� + if (TextUtils.isEmpty(compressPath)) { + compressPath = media.getRealPath(); + } + if (compressPath.equals(filePath)) { + isInResult = true; + break; + } + } + // 濡傛灉 result 涓病鏈夎璺緞锛屽垯灏嗗叾鍔犲叆寰呯Щ闄ゅ垪琛� + if (!isInResult) { + try { + //娌℃湁璇ユ枃浠朵互鍚庡彇娑堜笂浼� + uplodFileState.getThisCall().cancel(); + } catch (Exception e) { + e.printStackTrace(); + } + pathsToRemove.add(filePath); + } + } + for (String removeFile : pathsToRemove) { + uplodFileStates.remove(removeFile); + } + } + + /** + * + * @param context + * @param media + * @param uplodFileStates + * @param mAdapter + */ + public static void creatAndUploadFile(Context context, LocalMedia media, Map<String, UplodFileState> uplodFileStates, AddPictureAdapter mAdapter) { + String compressPath = media.getCompressPath(); + //鍒ゆ柇鏄惁鏈夎繖涓矾寰勶紝娌℃湁鐨勮瘽涓婁紶璇ュ浘鐗囧苟娣诲姞uplodFileStates涓� + if (TextUtils.isEmpty(compressPath)) { + compressPath = media.getRealPath(); + } + if (!uplodFileStates.containsKey(compressPath)) { + UplodFileState uplodFileState = new UplodFileState(); + uplodFileState.setFilePath(compressPath); + if (compressPath.toLowerCase().endsWith(".mp4") || compressPath.toLowerCase().endsWith(".avi") || compressPath.toLowerCase().endsWith(".mkv") || compressPath.toLowerCase().endsWith(".mov")) { + // 杩欐槸瑙嗛鏂囦欢 + uplodFileState.setUploadType(UplodFileState.VIDEO_TYPE); + } else { + uplodFileState.setUploadType(UplodFileState.IMG_TYPE); + } + uplodFileState.setExtName(media.getMimeType()); + uplodFileStates.put(compressPath, uplodFileState); + // 鎵ц涓婁紶鍥剧墖鐨勬搷浣� + FileUploadUtils.uploadFile(context, uplodFileState, uplodFileStates, mAdapter); + } + } + } -- Gitblit v1.8.0