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