app/src/main/java/com/dayu/pipirrapp/activity/AddIssueActivity.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/dayu/pipirrapp/activity/OrderDealActivity.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/dayu/pipirrapp/adapter/AddPictureAdapter.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/dayu/pipirrapp/net/ApiManager.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/dayu/pipirrapp/net/RetrofitClient.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/dayu/pipirrapp/tool/FileUploadUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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()); } //获取在PictureSelector的相册时取消选中的图片 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); } /** * 上报处理结果 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()); } //获取在PictureSelector的相册时取消选中的图片 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); } /** * 上报处理结果 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); 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 + "%"); }); }); 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; 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 @@ } /** * 当关闭activity时关闭所有请求 * 当关闭activity时关闭所有请求 * * @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); } } }